Browse Source

stream_base: always use Base template class

First cast the pointer to the child Base class before casting to the
parent class to make sure it returns the correct pointer.

PR-URL: https://github.com/nodejs/node/pull/6184
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: Anna Henningsen <anna@addaleax.net>
v7.x
Trevor Norris 9 years ago
parent
commit
13e5d4f320
  1. 26
      src/stream_base-inl.h

26
src/stream_base-inl.h

@ -77,8 +77,13 @@ void StreamBase::AddMethods(Environment* env,
template <class Base> template <class Base>
void StreamBase::GetFD(Local<String> key, void StreamBase::GetFD(Local<String> key,
const PropertyCallbackInfo<Value>& args) { const PropertyCallbackInfo<Value>& args) {
StreamBase* wrap = Unwrap<Base>(args.Holder()); Base* handle = Unwrap<Base>(args.Holder());
// Mimic implementation of StreamBase::GetFD() and UDPWrap::GetFD().
if (handle == nullptr)
return args.GetReturnValue().Set(-1);
StreamBase* wrap = static_cast<StreamBase*>(handle);
if (!wrap->IsAlive()) if (!wrap->IsAlive())
return args.GetReturnValue().Set(UV_EINVAL); return args.GetReturnValue().Set(UV_EINVAL);
@ -89,8 +94,13 @@ void StreamBase::GetFD(Local<String> key,
template <class Base> template <class Base>
void StreamBase::GetBytesRead(Local<String> key, void StreamBase::GetBytesRead(Local<String> key,
const PropertyCallbackInfo<Value>& args) { const PropertyCallbackInfo<Value>& args) {
StreamBase* wrap = Unwrap<Base>(args.Holder()); Base* handle = Unwrap<Base>(args.Holder());
// The handle instance hasn't been set. So no bytes could have been read.
if (handle == nullptr)
return args.GetReturnValue().Set(0);
StreamBase* wrap = static_cast<StreamBase*>(handle);
// uint64_t -> double. 53bits is enough for all real cases. // uint64_t -> double. 53bits is enough for all real cases.
args.GetReturnValue().Set(static_cast<double>(wrap->bytes_read_)); args.GetReturnValue().Set(static_cast<double>(wrap->bytes_read_));
} }
@ -99,8 +109,12 @@ void StreamBase::GetBytesRead(Local<String> key,
template <class Base> template <class Base>
void StreamBase::GetExternal(Local<String> key, void StreamBase::GetExternal(Local<String> key,
const PropertyCallbackInfo<Value>& args) { const PropertyCallbackInfo<Value>& args) {
StreamBase* wrap = Unwrap<Base>(args.Holder()); Base* handle = Unwrap<Base>(args.Holder());
if (handle == nullptr)
return args.GetReturnValue().SetUndefined();
StreamBase* wrap = static_cast<StreamBase*>(handle);
Local<External> ext = External::New(args.GetIsolate(), wrap); Local<External> ext = External::New(args.GetIsolate(), wrap);
args.GetReturnValue().Set(ext); args.GetReturnValue().Set(ext);
} }
@ -109,8 +123,12 @@ void StreamBase::GetExternal(Local<String> key,
template <class Base, template <class Base,
int (StreamBase::*Method)(const FunctionCallbackInfo<Value>& args)> int (StreamBase::*Method)(const FunctionCallbackInfo<Value>& args)>
void StreamBase::JSMethod(const FunctionCallbackInfo<Value>& args) { void StreamBase::JSMethod(const FunctionCallbackInfo<Value>& args) {
StreamBase* wrap = Unwrap<Base>(args.Holder()); Base* handle = Unwrap<Base>(args.Holder());
if (handle == nullptr)
return args.GetReturnValue().SetUndefined();
StreamBase* wrap = static_cast<StreamBase*>(handle);
if (!wrap->IsAlive()) if (!wrap->IsAlive())
return args.GetReturnValue().Set(UV_EINVAL); return args.GetReturnValue().Set(UV_EINVAL);

Loading…
Cancel
Save