GCC Code Coverage Report | |||||||||||||||||||||
|
|||||||||||||||||||||
Line | Branch | Exec | Source |
1 |
#include "js_stream.h" |
||
2 |
|||
3 |
#include "async_wrap.h" |
||
4 |
#include "env-inl.h" |
||
5 |
#include "node_errors.h" |
||
6 |
#include "stream_base-inl.h" |
||
7 |
#include "util-inl.h" |
||
8 |
#include "v8.h" |
||
9 |
|||
10 |
namespace node { |
||
11 |
|||
12 |
using errors::TryCatchScope; |
||
13 |
|||
14 |
using v8::Array; |
||
15 |
using v8::Context; |
||
16 |
using v8::FunctionCallbackInfo; |
||
17 |
using v8::FunctionTemplate; |
||
18 |
using v8::HandleScope; |
||
19 |
using v8::Int32; |
||
20 |
using v8::Isolate; |
||
21 |
using v8::Local; |
||
22 |
using v8::Object; |
||
23 |
using v8::Value; |
||
24 |
|||
25 |
|||
26 |
10654 |
JSStream::JSStream(Environment* env, Local<Object> obj) |
|
27 |
: AsyncWrap(env, obj, AsyncWrap::PROVIDER_JSSTREAM), |
||
28 |
10654 |
StreamBase(env) { |
|
29 |
10654 |
MakeWeak(); |
|
30 |
10654 |
StreamBase::AttachToObject(obj); |
|
31 |
10654 |
} |
|
32 |
|||
33 |
|||
34 |
11449 |
AsyncWrap* JSStream::GetAsyncWrap() { |
|
35 |
11449 |
return static_cast<AsyncWrap*>(this); |
|
36 |
} |
||
37 |
|||
38 |
|||
39 |
10679 |
bool JSStream::IsAlive() { |
|
40 |
10679 |
return true; |
|
41 |
} |
||
42 |
|||
43 |
|||
44 |
bool JSStream::IsClosing() { |
||
45 |
HandleScope scope(env()->isolate()); |
||
46 |
Context::Scope context_scope(env()->context()); |
||
47 |
TryCatchScope try_catch(env()); |
||
48 |
Local<Value> value; |
||
49 |
if (!MakeCallback(env()->isclosing_string(), 0, nullptr).ToLocal(&value)) { |
||
50 |
if (try_catch.HasCaught() && !try_catch.HasTerminated()) |
||
51 |
errors::TriggerUncaughtException(env()->isolate(), try_catch); |
||
52 |
return true; |
||
53 |
} |
||
54 |
return value->IsTrue(); |
||
55 |
} |
||
56 |
|||
57 |
|||
58 |
10824 |
int JSStream::ReadStart() { |
|
59 |
21648 |
HandleScope scope(env()->isolate()); |
|
60 |
10824 |
Context::Scope context_scope(env()->context()); |
|
61 |
21648 |
TryCatchScope try_catch(env()); |
|
62 |
Local<Value> value; |
||
63 |
10824 |
int value_int = UV_EPROTO; |
|
64 |
✓✗✗✓ ✗✓ |
43296 |
if (!MakeCallback(env()->onreadstart_string(), 0, nullptr).ToLocal(&value) || |
65 |
32472 |
!value->Int32Value(env()->context()).To(&value_int)) { |
|
66 |
if (try_catch.HasCaught() && !try_catch.HasTerminated()) |
||
67 |
errors::TriggerUncaughtException(env()->isolate(), try_catch); |
||
68 |
} |
||
69 |
21648 |
return value_int; |
|
70 |
} |
||
71 |
|||
72 |
|||
73 |
193 |
int JSStream::ReadStop() { |
|
74 |
386 |
HandleScope scope(env()->isolate()); |
|
75 |
193 |
Context::Scope context_scope(env()->context()); |
|
76 |
386 |
TryCatchScope try_catch(env()); |
|
77 |
Local<Value> value; |
||
78 |
193 |
int value_int = UV_EPROTO; |
|
79 |
✓✓✗✓ ✓✓ |
771 |
if (!MakeCallback(env()->onreadstop_string(), 0, nullptr).ToLocal(&value) || |
80 |
577 |
!value->Int32Value(env()->context()).To(&value_int)) { |
|
81 |
✗✓✗✗ ✗✓ |
1 |
if (try_catch.HasCaught() && !try_catch.HasTerminated()) |
82 |
errors::TriggerUncaughtException(env()->isolate(), try_catch); |
||
83 |
} |
||
84 |
386 |
return value_int; |
|
85 |
} |
||
86 |
|||
87 |
|||
88 |
13 |
int JSStream::DoShutdown(ShutdownWrap* req_wrap) { |
|
89 |
26 |
HandleScope scope(env()->isolate()); |
|
90 |
13 |
Context::Scope context_scope(env()->context()); |
|
91 |
|||
92 |
Local<Value> argv[] = { |
||
93 |
req_wrap->object() |
||
94 |
26 |
}; |
|
95 |
|||
96 |
26 |
TryCatchScope try_catch(env()); |
|
97 |
Local<Value> value; |
||
98 |
13 |
int value_int = UV_EPROTO; |
|
99 |
✗✓ | 39 |
if (!MakeCallback(env()->onshutdown_string(), |
100 |
13 |
arraysize(argv), |
|
101 |
✓✗✗✓ |
65 |
argv).ToLocal(&value) || |
102 |
39 |
!value->Int32Value(env()->context()).To(&value_int)) { |
|
103 |
if (try_catch.HasCaught() && !try_catch.HasTerminated()) |
||
104 |
errors::TriggerUncaughtException(env()->isolate(), try_catch); |
||
105 |
} |
||
106 |
26 |
return value_int; |
|
107 |
} |
||
108 |
|||
109 |
|||
110 |
749 |
int JSStream::DoWrite(WriteWrap* w, |
|
111 |
uv_buf_t* bufs, |
||
112 |
size_t count, |
||
113 |
uv_stream_t* send_handle) { |
||
114 |
✗✓ | 749 |
CHECK_NULL(send_handle); |
115 |
|||
116 |
1497 |
HandleScope scope(env()->isolate()); |
|
117 |
749 |
Context::Scope context_scope(env()->context()); |
|
118 |
|||
119 |
1497 |
MaybeStackBuffer<Local<Value>, 16> bufs_arr(count); |
|
120 |
✓✓ | 1805 |
for (size_t i = 0; i < count; i++) { |
121 |
1056 |
bufs_arr[i] = |
|
122 |
2112 |
Buffer::Copy(env(), bufs[i].base, bufs[i].len).ToLocalChecked(); |
|
123 |
} |
||
124 |
|||
125 |
Local<Value> argv[] = { |
||
126 |
w->object(), |
||
127 |
Array::New(env()->isolate(), bufs_arr.out(), count) |
||
128 |
2247 |
}; |
|
129 |
|||
130 |
1497 |
TryCatchScope try_catch(env()); |
|
131 |
Local<Value> value; |
||
132 |
749 |
int value_int = UV_EPROTO; |
|
133 |
✓✓ | 2247 |
if (!MakeCallback(env()->onwrite_string(), |
134 |
749 |
arraysize(argv), |
|
135 |
✓✓✗✓ |
3743 |
argv).ToLocal(&value) || |
136 |
2243 |
!value->Int32Value(env()->context()).To(&value_int)) { |
|
137 |
✓✗✓✗ ✓✗ |
2 |
if (try_catch.HasCaught() && !try_catch.HasTerminated()) |
138 |
2 |
errors::TriggerUncaughtException(env()->isolate(), try_catch); |
|
139 |
} |
||
140 |
1496 |
return value_int; |
|
141 |
} |
||
142 |
|||
143 |
|||
144 |
10654 |
void JSStream::New(const FunctionCallbackInfo<Value>& args) { |
|
145 |
// This constructor should not be exposed to public javascript. |
||
146 |
// Therefore we assert that we are not trying to call this as a |
||
147 |
// normal function. |
||
148 |
✗✓ | 10654 |
CHECK(args.IsConstructCall()); |
149 |
10654 |
Environment* env = Environment::GetCurrent(args); |
|
150 |
10654 |
new JSStream(env, args.This()); |
|
151 |
10654 |
} |
|
152 |
|||
153 |
|||
154 |
template <class Wrap> |
||
155 |
752 |
void JSStream::Finish(const FunctionCallbackInfo<Value>& args) { |
|
156 |
✗✓✗✓ |
1504 |
CHECK(args[0]->IsObject()); |
157 |
1504 |
Wrap* w = static_cast<Wrap*>(StreamReq::FromObject(args[0].As<Object>())); |
|
158 |
|||
159 |
✗✓✗✓ |
1504 |
CHECK(args[1]->IsInt32()); |
160 |
3008 |
w->Done(args[1].As<Int32>()->Value()); |
|
161 |
752 |
} |
|
162 |
|||
163 |
|||
164 |
1035 |
void JSStream::ReadBuffer(const FunctionCallbackInfo<Value>& args) { |
|
165 |
JSStream* wrap; |
||
166 |
✗✓ | 1035 |
ASSIGN_OR_RETURN_UNWRAP(&wrap, args.Holder()); |
167 |
|||
168 |
1035 |
ArrayBufferViewContents<char> buffer(args[0]); |
|
169 |
1035 |
const char* data = buffer.data(); |
|
170 |
1035 |
int len = buffer.length(); |
|
171 |
|||
172 |
// Repeatedly ask the stream's owner for memory, copy the data that we |
||
173 |
// just read from JS into those buffers and emit them as reads. |
||
174 |
✓✓ | 3103 |
while (len != 0) { |
175 |
1035 |
uv_buf_t buf = wrap->EmitAlloc(len); |
|
176 |
1035 |
ssize_t avail = len; |
|
177 |
✗✓ | 1035 |
if (static_cast<ssize_t>(buf.len) < avail) |
178 |
avail = buf.len; |
||
179 |
|||
180 |
1035 |
memcpy(buf.base, data, avail); |
|
181 |
1035 |
data += avail; |
|
182 |
1035 |
len -= static_cast<int>(avail); |
|
183 |
1035 |
wrap->EmitRead(avail, buf); |
|
184 |
} |
||
185 |
} |
||
186 |
|||
187 |
|||
188 |
12 |
void JSStream::EmitEOF(const FunctionCallbackInfo<Value>& args) { |
|
189 |
JSStream* wrap; |
||
190 |
✗✓ | 12 |
ASSIGN_OR_RETURN_UNWRAP(&wrap, args.Holder()); |
191 |
|||
192 |
24 |
wrap->EmitRead(UV_EOF); |
|
193 |
} |
||
194 |
|||
195 |
|||
196 |
596 |
void JSStream::Initialize(Local<Object> target, |
|
197 |
Local<Value> unused, |
||
198 |
Local<Context> context, |
||
199 |
void* priv) { |
||
200 |
596 |
Environment* env = Environment::GetCurrent(context); |
|
201 |
596 |
Isolate* isolate = env->isolate(); |
|
202 |
|||
203 |
596 |
Local<FunctionTemplate> t = NewFunctionTemplate(isolate, New); |
|
204 |
1192 |
t->InstanceTemplate() |
|
205 |
596 |
->SetInternalFieldCount(StreamBase::kInternalFieldCount); |
|
206 |
596 |
t->Inherit(AsyncWrap::GetConstructorTemplate(env)); |
|
207 |
|||
208 |
596 |
SetProtoMethod(isolate, t, "finishWrite", Finish<WriteWrap>); |
|
209 |
596 |
SetProtoMethod(isolate, t, "finishShutdown", Finish<ShutdownWrap>); |
|
210 |
596 |
SetProtoMethod(isolate, t, "readBuffer", ReadBuffer); |
|
211 |
596 |
SetProtoMethod(isolate, t, "emitEOF", EmitEOF); |
|
212 |
|||
213 |
596 |
StreamBase::AddMethods(env, t); |
|
214 |
596 |
SetConstructorFunction(context, target, "JSStream", t); |
|
215 |
596 |
} |
|
216 |
|||
217 |
} // namespace node |
||
218 |
|||
219 |
✓✗✓✗ |
22488 |
NODE_MODULE_CONTEXT_AWARE_INTERNAL(js_stream, node::JSStream::Initialize) |
Generated by: GCOVR (Version 4.2) |