1 #include <v8.h>
2 #include <node.h>
3 #include <assert.h>
4
5 using v8::Isolate;
6 using v8::Context;
7 using v8::Local;
8 using v8::MaybeLocal;
9 using v8::Value;
10 using v8::Number;
11 using v8::String;
12 using v8::Object;
13 using v8::Array;
14 using v8::ArrayBufferView;
15 using v8::ArrayBuffer;
16 using v8::FunctionCallbackInfo;
17
CallWithString(const FunctionCallbackInfo<Value> & args)18 void CallWithString(const FunctionCallbackInfo<Value>& args) {
19 assert(args.Length() == 1 && args[0]->IsString());
20 if (args.Length() == 1 && args[0]->IsString()) {
21 Local<String> str = args[0].As<String>();
22 const int32_t length = str->Utf8Length(args.GetIsolate()) + 1;
23 char* buf = new char[length];
24 str->WriteUtf8(args.GetIsolate(), buf, length);
25 delete [] buf;
26 }
27 }
28
CallWithArray(const FunctionCallbackInfo<Value> & args)29 void CallWithArray(const FunctionCallbackInfo<Value>& args) {
30 assert(args.Length() == 1 && args[0]->IsArray());
31 if (args.Length() == 1 && args[0]->IsArray()) {
32 const Local<Array> array = args[0].As<Array>();
33 uint32_t length = array->Length();
34 for (uint32_t i = 0; i < length; ++ i) {
35 Local<Value> v;
36 v = array->Get(args.GetIsolate()->GetCurrentContext(),
37 i).ToLocalChecked();
38 }
39 }
40 }
41
CallWithNumber(const FunctionCallbackInfo<Value> & args)42 void CallWithNumber(const FunctionCallbackInfo<Value>& args) {
43 assert(args.Length() == 1 && args[0]->IsNumber());
44 if (args.Length() == 1 && args[0]->IsNumber()) {
45 args[0].As<Number>()->Value();
46 }
47 }
48
CallWithObject(const FunctionCallbackInfo<Value> & args)49 void CallWithObject(const FunctionCallbackInfo<Value>& args) {
50 Isolate* isolate = args.GetIsolate();
51 Local<Context> context = isolate->GetCurrentContext();
52
53 assert(args.Length() == 1 && args[0]->IsObject());
54 if (args.Length() == 1 && args[0]->IsObject()) {
55 Local<Object> obj = args[0].As<Object>();
56
57 MaybeLocal<String> map_key = String::NewFromUtf8(isolate,
58 "map", v8::NewStringType::kNormal);
59 assert(!map_key.IsEmpty());
60 MaybeLocal<Value> map_maybe = obj->Get(context,
61 map_key.ToLocalChecked());
62 assert(!map_maybe.IsEmpty());
63 Local<Value> map;
64 map = map_maybe.ToLocalChecked();
65
66 MaybeLocal<String> operand_key = String::NewFromUtf8(isolate,
67 "operand", v8::NewStringType::kNormal);
68 assert(!operand_key.IsEmpty());
69 MaybeLocal<Value> operand_maybe = obj->Get(context,
70 operand_key.ToLocalChecked());
71 assert(!operand_maybe.IsEmpty());
72 Local<Value> operand;
73 operand = operand_maybe.ToLocalChecked();
74
75 MaybeLocal<String> data_key = String::NewFromUtf8(isolate,
76 "data", v8::NewStringType::kNormal);
77 assert(!data_key.IsEmpty());
78 MaybeLocal<Value> data_maybe = obj->Get(context,
79 data_key.ToLocalChecked());
80 assert(!data_maybe.IsEmpty());
81 Local<Value> data;
82 data = data_maybe.ToLocalChecked();
83
84 MaybeLocal<String> reduce_key = String::NewFromUtf8(isolate,
85 "reduce", v8::NewStringType::kNormal);
86 assert(!reduce_key.IsEmpty());
87 MaybeLocal<Value> reduce_maybe = obj->Get(context,
88 reduce_key.ToLocalChecked());
89 assert(!reduce_maybe.IsEmpty());
90 Local<Value> reduce;
91 reduce = reduce_maybe.ToLocalChecked();
92 }
93 }
94
CallWithTypedarray(const FunctionCallbackInfo<Value> & args)95 void CallWithTypedarray(const FunctionCallbackInfo<Value>& args) {
96 assert(args.Length() == 1 && args[0]->IsArrayBufferView());
97 if (args.Length() == 1 && args[0]->IsArrayBufferView()) {
98 assert(args[0]->IsArrayBufferView());
99 Local<ArrayBufferView> view = args[0].As<ArrayBufferView>();
100 const size_t byte_offset = view->ByteOffset();
101 const size_t byte_length = view->ByteLength();
102 assert(byte_length > 0);
103 assert(view->HasBuffer());
104 Local<ArrayBuffer> buffer;
105 buffer = view->Buffer();
106 ArrayBuffer::Contents contents;
107 contents = buffer->GetContents();
108 const uint32_t* data = reinterpret_cast<uint32_t*>(
109 static_cast<uint8_t*>(contents.Data()) + byte_offset);
110 assert(data);
111 }
112 }
113
CallWithArguments(const FunctionCallbackInfo<Value> & args)114 void CallWithArguments(const FunctionCallbackInfo<Value>& args) {
115 assert(args.Length() > 1 && args[0]->IsNumber());
116 if (args.Length() > 1 && args[0]->IsNumber()) {
117 int32_t loop = args[0].As<v8::Uint32>()->Value();
118 for (int32_t i = 1; i < loop; ++i) {
119 assert(i < args.Length());
120 assert(args[i]->IsUint32());
121 args[i].As<v8::Uint32>()->Value();
122 }
123 }
124 }
125
Initialize(Local<Object> target)126 void Initialize(Local<Object> target) {
127 NODE_SET_METHOD(target, "callWithString", CallWithString);
128 NODE_SET_METHOD(target, "callWithLongString", CallWithString);
129
130 NODE_SET_METHOD(target, "callWithArray", CallWithArray);
131 NODE_SET_METHOD(target, "callWithLargeArray", CallWithArray);
132 NODE_SET_METHOD(target, "callWithHugeArray", CallWithArray);
133
134 NODE_SET_METHOD(target, "callWithNumber", CallWithNumber);
135 NODE_SET_METHOD(target, "callWithObject", CallWithObject);
136 NODE_SET_METHOD(target, "callWithTypedarray", CallWithTypedarray);
137
138 NODE_SET_METHOD(target, "callWith10Numbers", CallWithArguments);
139 NODE_SET_METHOD(target, "callWith100Numbers", CallWithArguments);
140 NODE_SET_METHOD(target, "callWith1000Numbers", CallWithArguments);
141 }
142
143 NODE_MODULE(NODE_GYP_MODULE_NAME, Initialize)
144