• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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