| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -159,7 +159,7 @@ function startListening(socket) { | |||
| 159 | 159 | const state = socket[kStateSymbol]; | |
| 160 | 160 | ||
| 161 | 161 | state.handle.onmessage = onMessage; | |
| 162 | - // Todo: handle errors | ||
| 162 | + state.handle.onerror = onError; | ||
| 163 | 163 | state.handle.recvStart(); | |
| 164 | 164 | state.receiving = true; | |
| 165 | 165 | state.bindState = BIND_STATE_BOUND; | |
@@ -923,6 +923,12 @@ function onMessage(nread, handle, buf, rinfo) { | |||
| 923 | 923 | } | |
| 924 | 924 | ||
| 925 | 925 | ||
| 926 | + function onError(nread, handle, error) { | ||
| 927 | + const self = handle[owner_symbol]; | ||
| 928 | + return self.emit('error', error); | ||
| 929 | + } | ||
| 930 | + | ||
| 931 | + | ||
| 926 | 932 | Socket.prototype.ref = function() { | |
| 927 | 933 | const handle = this[kStateSymbol].handle; | |
| 928 | 934 | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -5,6 +5,9 @@ | |||
| 5 | 5 | ||
| 6 | 6 | #include <algorithm> | |
| 7 | 7 | ||
| 8 | + // TODO(RaisinTen): Replace all uses with empty `v8::Maybe`s. | ||
| 9 | + #define JS_EXCEPTION_PENDING UV_EPROTO | ||
| 10 | + | ||
| 8 | 11 | namespace node { | |
| 9 | 12 | ||
| 10 | 13 | using errors::TryCatchScope; | |
@@ -60,7 +63,7 @@ int JSUDPWrap::RecvStart() { | |||
| 60 | 63 | Context::Scope context_scope(env()->context()); | |
| 61 | 64 | TryCatchScope try_catch(env()); | |
| 62 | 65 | Local<Value> value; | |
| 63 | - int32_t value_int = UV_EPROTO; | ||
| 66 | + int32_t value_int = JS_EXCEPTION_PENDING; | ||
| 64 | 67 | if (!MakeCallback(env()->onreadstart_string(), 0, nullptr).ToLocal(&value) || | |
| 65 | 68 | !value->Int32Value(env()->context()).To(&value_int)) { | |
| 66 | 69 | if (try_catch.HasCaught() && !try_catch.HasTerminated()) | |
@@ -74,7 +77,7 @@ int JSUDPWrap::RecvStop() { | |||
| 74 | 77 | Context::Scope context_scope(env()->context()); | |
| 75 | 78 | TryCatchScope try_catch(env()); | |
| 76 | 79 | Local<Value> value; | |
| 77 | - int32_t value_int = UV_EPROTO; | ||
| 80 | + int32_t value_int = JS_EXCEPTION_PENDING; | ||
| 78 | 81 | if (!MakeCallback(env()->onreadstop_string(), 0, nullptr).ToLocal(&value) || | |
| 79 | 82 | !value->Int32Value(env()->context()).To(&value_int)) { | |
| 80 | 83 | if (try_catch.HasCaught() && !try_catch.HasTerminated()) | |
@@ -90,7 +93,7 @@ ssize_t JSUDPWrap::Send(uv_buf_t* bufs, | |||
| 90 | 93 | Context::Scope context_scope(env()->context()); | |
| 91 | 94 | TryCatchScope try_catch(env()); | |
| 92 | 95 | Local<Value> value; | |
| 93 | - int64_t value_int = UV_EPROTO; | ||
| 96 | + int64_t value_int = JS_EXCEPTION_PENDING; | ||
| 94 | 97 | size_t total_len = 0; | |
| 95 | 98 | ||
| 96 | 99 | MaybeStackBuffer<Local<Value>, 16> buffers(nbufs); | |
@@ -100,10 +103,13 @@ ssize_t JSUDPWrap::Send(uv_buf_t* bufs, | |||
| 100 | 103 | total_len += bufs[i].len; | |
| 101 | 104 | } | |
| 102 | 105 | ||
| 106 | + Local<Object> address; | ||
| 107 | + if (!AddressToJS(env(), addr).ToLocal(&address)) return value_int; | ||
| 108 | + | ||
| 103 | 109 | Local<Value> args[] = { | |
| 104 | 110 | listener()->CreateSendWrap(total_len)->object(), | |
| 105 | 111 | Array::New(env()->isolate(), buffers.out(), nbufs), | |
| 106 | - AddressToJS(env(), addr) | ||
| 112 | + address, | ||
| 107 | 113 | }; | |
| 108 | 114 | ||
| 109 | 115 | if (!MakeCallback(env()->onwrite_string(), arraysize(args), args) | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -58,7 +58,7 @@ class Environment; | |||
| 58 | 58 | // Convert a struct sockaddr to a { address: '1.2.3.4', port: 1234 } JS object. | |
| 59 | 59 | // Sets address and port properties on the info object and returns it. | |
| 60 | 60 | // If |info| is omitted, a new object is returned. | |
| 61 | - v8::Local<v8::Object> AddressToJS( | ||
| 61 | + v8::MaybeLocal<v8::Object> AddressToJS( | ||
| 62 | 62 | Environment* env, | |
| 63 | 63 | const sockaddr* addr, | |
| 64 | 64 | v8::Local<v8::Object> info = v8::Local<v8::Object>()); | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -157,7 +157,7 @@ void SocketAddress::Update(const sockaddr* data, size_t len) { | |||
| 157 | 157 | memcpy(&address_, data, len); | |
| 158 | 158 | } | |
| 159 | 159 | ||
| 160 | - v8::Local<v8::Object> SocketAddress::ToJS( | ||
| 160 | + v8::MaybeLocal<v8::Object> SocketAddress::ToJS( | ||
| 161 | 161 | Environment* env, | |
| 162 | 162 | v8::Local<v8::Object> info) const { | |
| 163 | 163 | return AddressToJS(env, data(), info); | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -847,7 +847,9 @@ void SocketAddressBase::LegacyDetail(const FunctionCallbackInfo<Value>& args) { | |||
| 847 | 847 | Environment* env = Environment::GetCurrent(args); | |
| 848 | 848 | SocketAddressBase* base; | |
| 849 | 849 | ASSIGN_OR_RETURN_UNWRAP(&base, args.Holder()); | |
| 850 | - args.GetReturnValue().Set(base->address_->ToJS(env)); | ||
| 850 | + Local<Object> address; | ||
| 851 | + if (!base->address_->ToJS(env).ToLocal(&address)) return; | ||
| 852 | + args.GetReturnValue().Set(address); | ||
| 851 | 853 | } | |
| 852 | 854 | ||
| 853 | 855 | SocketAddressBase::SocketAddressBase( | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -131,7 +131,7 @@ class SocketAddress : public MemoryRetainer { | |||
| 131 | 131 | static SocketAddress FromPeerName(const uv_udp_t& handle); | |
| 132 | 132 | static SocketAddress FromPeerName(const uv_tcp_t& handle); | |
| 133 | 133 | ||
| 134 | - inline v8::Local<v8::Object> ToJS( | ||
| 134 | + inline v8::MaybeLocal<v8::Object> ToJS( | ||
| 135 | 135 | Environment* env, | |
| 136 | 136 | v8::Local<v8::Object> obj = v8::Local<v8::Object>()) const; | |
| 137 | 137 | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -342,9 +342,9 @@ void TCPWrap::Connect(const FunctionCallbackInfo<Value>& args, | |||
| 342 | 342 | ||
| 343 | 343 | ||
| 344 | 344 | // also used by udp_wrap.cc | |
| 345 | - Local<Object> AddressToJS(Environment* env, | ||
| 346 | - const sockaddr* addr, | ||
| 347 | - Local<Object> info) { | ||
| 345 | + MaybeLocal<Object> AddressToJS(Environment* env, | ||
| 346 | + const sockaddr* addr, | ||
| 347 | + Local<Object> info) { | ||
| 348 | 348 | EscapableHandleScope scope(env->isolate()); | |
| 349 | 349 | char ip[INET6_ADDRSTRLEN + UV_IF_NAMESIZE]; | |
| 350 | 350 | const sockaddr_in* a4; | |
@@ -371,8 +371,7 @@ Local<Object> AddressToJS(Environment* env, | |||
| 371 | 371 | &scopeidlen); | |
| 372 | 372 | if (r) { | |
| 373 | 373 | env->ThrowUVException(r, "uv_if_indextoiid"); | |
| 374 | - // TODO(addaleax): Do proper MaybeLocal handling here | ||
| 375 | - return scope.Escape(info); | ||
| 374 | + return {}; | ||
| 376 | 375 | } | |
| 377 | 376 | } | |
| 378 | 377 | port = ntohs(a6->sin6_port); | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -22,13 +22,15 @@ | |||
| 22 | 22 | #include "udp_wrap.h" | |
| 23 | 23 | #include "env-inl.h" | |
| 24 | 24 | #include "node_buffer.h" | |
| 25 | + #include "node_errors.h" | ||
| 25 | 26 | #include "node_sockaddr-inl.h" | |
| 26 | 27 | #include "handle_wrap.h" | |
| 27 | 28 | #include "req_wrap-inl.h" | |
| 28 | 29 | #include "util-inl.h" | |
| 29 | 30 | ||
| 30 | 31 | namespace node { | |
| 31 | 32 | ||
| 33 | + using errors::TryCatchScope; | ||
| 32 | 34 | using v8::Array; | |
| 33 | 35 | using v8::ArrayBuffer; | |
| 34 | 36 | using v8::BackingStore; | |
@@ -728,9 +730,45 @@ void UDPWrap::OnRecv(ssize_t nread, | |||
| 728 | 730 | bs = BackingStore::Reallocate(isolate, std::move(bs), nread); | |
| 729 | 731 | } | |
| 730 | 732 | ||
| 733 | + Local<Object> address; | ||
| 734 | + { | ||
| 735 | + bool has_caught = false; | ||
| 736 | + { | ||
| 737 | + TryCatchScope try_catch(env); | ||
| 738 | + if (!AddressToJS(env, addr).ToLocal(&address)) { | ||
| 739 | + DCHECK(try_catch.HasCaught() && !try_catch.HasTerminated()); | ||
| 740 | + argv[2] = try_catch.Exception(); | ||
| 741 | + DCHECK(!argv[2].IsEmpty()); | ||
| 742 | + has_caught = true; | ||
| 743 | + } | ||
| 744 | + } | ||
| 745 | + if (has_caught) { | ||
| 746 | + DCHECK(!argv[2].IsEmpty()); | ||
| 747 | + MakeCallback(env->onerror_string(), arraysize(argv), argv); | ||
| 748 | + return; | ||
| 749 | + } | ||
| 750 | + } | ||
| 751 | + | ||
| 731 | 752 | Local<ArrayBuffer> ab = ArrayBuffer::New(isolate, std::move(bs)); | |
| 732 | - argv[2] = Buffer::New(env, ab, 0, ab->ByteLength()).ToLocalChecked(); | ||
| 733 | - argv[3] = AddressToJS(env, addr); | ||
| 753 | + { | ||
| 754 | + bool has_caught = false; | ||
| 755 | + { | ||
| 756 | + TryCatchScope try_catch(env); | ||
| 757 | + if (!Buffer::New(env, ab, 0, ab->ByteLength()).ToLocal(&argv[2])) { | ||
| 758 | + DCHECK(try_catch.HasCaught() && !try_catch.HasTerminated()); | ||
| 759 | + argv[2] = try_catch.Exception(); | ||
| 760 | + DCHECK(!argv[2].IsEmpty()); | ||
| 761 | + has_caught = true; | ||
| 762 | + } | ||
| 763 | + } | ||
| 764 | + if (has_caught) { | ||
| 765 | + DCHECK(!argv[2].IsEmpty()); | ||
| 766 | + MakeCallback(env->onerror_string(), arraysize(argv), argv); | ||
| 767 | + return; | ||
| 768 | + } | ||
| 769 | + } | ||
| 770 | + | ||
| 771 | + argv[3] = address; | ||
| 734 | 772 | MakeCallback(env->onmessage_string(), arraysize(argv), argv); | |
| 735 | 773 | } | |
| 736 | 774 | ||
| Back | FazBrowse Home | New Git URL |
0 commit comments