mirror of
https://github.com/nodejs/node.git
synced 2026-11-09 15:11:11 -05:00
- Instead of storing a pointer whose type refers to the specific subclass of `BaseObject`, just store a `BaseObject*` directly. This means in particular that one can cast to classes along the way of the inheritance chain without issues, and that `BaseObject*` no longer needs to be the first superclass in the case of multiple inheritance. In particular, this renders hack-y solutions to this problem (likeddc19be6de) obsolete and addresses a `TODO` comment of mine. - Move wrapping/unwrapping methods to the `BaseObject` class. We use these almost exclusively for `BaseObject`s, and I hope that this gives a better idea of how (and for what) these are used in our code. - Perform initialization/deinitialization of the internal field in the `BaseObject*` constructor/destructor. This makes the code a bit more obviously correct, avoids explicit calls for this in subclass constructors, and in particular allows us to avoid crash situations when we previously called `ClearWrap()` during GC. This also means that we enforce that the object passed to the `BaseObject` constructor needs to have an internal field. This is the only reason for the test change. - Change the signature of `MakeWeak()` to not require a pointer argument. Previously, this would always have been the same as `this`, and no other value made sense. Also, the parameter was something that I personally found somewhat confusing when becoming familiar with Node’s code. - Add a `TODO` comment that motivates switching to real inheritance for the JS types we expose from the native side. This patch brings us a lot closer to being able to do that. - Some less significant drive-by cleanup. Since we *effectively* already store the `BaseObject*` pointer anyway sinceddc19be6de, I do not think that this is going to have any impact on diagnostic tooling. Fixes: https://github.com/nodejs/node/issues/18897 PR-URL: https://github.com/nodejs/node/pull/20455 Reviewed-By: Gus Caplan <me@gus.host> Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl> Reviewed-By: Daniel Bevenius <daniel.bevenius@gmail.com>
75 lines
3.2 KiB
C++
75 lines
3.2 KiB
C++
// Copyright Joyent, Inc. and other Node contributors.
|
|
//
|
|
// Permission is hereby granted, free of charge, to any person obtaining a
|
|
// copy of this software and associated documentation files (the
|
|
// "Software"), to deal in the Software without restriction, including
|
|
// without limitation the rights to use, copy, modify, merge, publish,
|
|
// distribute, sublicense, and/or sell copies of the Software, and to permit
|
|
// persons to whom the Software is furnished to do so, subject to the
|
|
// following conditions:
|
|
//
|
|
// The above copyright notice and this permission notice shall be included
|
|
// in all copies or substantial portions of the Software.
|
|
//
|
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
|
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
|
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
|
// USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
|
#ifndef SRC_NODE_WRAP_H_
|
|
#define SRC_NODE_WRAP_H_
|
|
|
|
#if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
|
|
|
|
#include "env.h"
|
|
#include "pipe_wrap.h"
|
|
#include "tcp_wrap.h"
|
|
#include "tty_wrap.h"
|
|
#include "uv.h"
|
|
#include "v8.h"
|
|
|
|
namespace node {
|
|
|
|
// TODO(addaleax): Use real inheritance for the JS object templates to avoid
|
|
// this unnecessary case switching.
|
|
#define WITH_GENERIC_UV_STREAM(env, obj, BODY, ELSE) \
|
|
do { \
|
|
if (env->tcp_constructor_template().IsEmpty() == false && \
|
|
env->tcp_constructor_template()->HasInstance(obj)) { \
|
|
TCPWrap* const wrap = Unwrap<TCPWrap>(obj); \
|
|
BODY \
|
|
} else if (env->tty_constructor_template().IsEmpty() == false && \
|
|
env->tty_constructor_template()->HasInstance(obj)) { \
|
|
TTYWrap* const wrap = Unwrap<TTYWrap>(obj); \
|
|
BODY \
|
|
} else if (env->pipe_constructor_template().IsEmpty() == false && \
|
|
env->pipe_constructor_template()->HasInstance(obj)) { \
|
|
PipeWrap* const wrap = Unwrap<PipeWrap>(obj); \
|
|
BODY \
|
|
} else { \
|
|
ELSE \
|
|
} \
|
|
} while (0)
|
|
|
|
inline uv_stream_t* HandleToStream(Environment* env,
|
|
v8::Local<v8::Object> obj) {
|
|
v8::HandleScope scope(env->isolate());
|
|
|
|
WITH_GENERIC_UV_STREAM(env, obj, {
|
|
if (wrap == nullptr)
|
|
return nullptr;
|
|
return reinterpret_cast<uv_stream_t*>(wrap->UVHandle());
|
|
}, {});
|
|
|
|
return nullptr;
|
|
}
|
|
|
|
} // namespace node
|
|
|
|
#endif // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
|
|
|
|
#endif // SRC_NODE_WRAP_H_
|