Skip to content

Commit

Permalink
stream_base: remove static JSMethod declarations
Browse files Browse the repository at this point in the history
Move JS methods to the stream_base-inl.h and thus define them on each
use of `StreamBase::AddMethods`. Inline `AddMethods` itself, so that
there won't be any need in a static declaration in stream_base.cc.

NOTE: This basically allows using this API in user-land, though, some
polishing is required before releasing it.

PR-URL: nodejs#957
Reviewed-By: Chris Dickinson <[email protected]>
  • Loading branch information
indutny authored and rvagg committed Feb 25, 2015
1 parent a558cd0 commit 89e133a
Show file tree
Hide file tree
Showing 7 changed files with 100 additions and 70 deletions.
1 change: 1 addition & 0 deletions node.gyp
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,7 @@
'src/req-wrap-inl.h',
'src/string_bytes.h',
'src/stream_base.h',
'src/stream_base-inl.h',
'src/stream_wrap.h',
'src/tree.h',
'src/util.h',
Expand Down
1 change: 1 addition & 0 deletions src/js_stream.cc
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#include "env-inl.h"
#include "node_buffer.h"
#include "stream_base.h"
#include "stream_base-inl.h"
#include "v8.h"

namespace node {
Expand Down
83 changes: 83 additions & 0 deletions src/stream_base-inl.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
#ifndef SRC_STREAM_BASE_INL_H_
#define SRC_STREAM_BASE_INL_H_

#include "stream_base.h"

#include "node.h"
#include "env.h"
#include "env-inl.h"
#include "v8.h"

namespace node {

using v8::FunctionCallbackInfo;
using v8::FunctionTemplate;
using v8::Handle;
using v8::HandleScope;
using v8::Local;
using v8::PropertyAttribute;
using v8::PropertyCallbackInfo;
using v8::String;
using v8::Value;

template <class Base>
void StreamBase::AddMethods(Environment* env, Handle<FunctionTemplate> t) {
HandleScope scope(env->isolate());

enum PropertyAttribute attributes =
static_cast<PropertyAttribute>(v8::ReadOnly | v8::DontDelete);
t->InstanceTemplate()->SetAccessor(env->fd_string(),
GetFD<Base>,
nullptr,
Handle<Value>(),
v8::DEFAULT,
attributes);

env->SetProtoMethod(t, "readStart", JSMethod<Base, &StreamBase::ReadStart>);
env->SetProtoMethod(t, "readStop", JSMethod<Base, &StreamBase::ReadStop>);
env->SetProtoMethod(t, "shutdown", JSMethod<Base, &StreamBase::Shutdown>);
env->SetProtoMethod(t, "writev", JSMethod<Base, &StreamBase::Writev>);
env->SetProtoMethod(t,
"writeBuffer",
JSMethod<Base, &StreamBase::WriteBuffer>);
env->SetProtoMethod(t,
"writeAsciiString",
JSMethod<Base, &StreamBase::WriteString<ASCII> >);
env->SetProtoMethod(t,
"writeUtf8String",
JSMethod<Base, &StreamBase::WriteString<UTF8> >);
env->SetProtoMethod(t,
"writeUcs2String",
JSMethod<Base, &StreamBase::WriteString<UCS2> >);
env->SetProtoMethod(t,
"writeBinaryString",
JSMethod<Base, &StreamBase::WriteString<BINARY> >);
}


template <class Base>
void StreamBase::GetFD(Local<String> key,
const PropertyCallbackInfo<Value>& args) {
StreamBase* wrap = Unwrap<Base>(args.Holder());

if (!wrap->IsAlive())
return args.GetReturnValue().Set(UV_EINVAL);

args.GetReturnValue().Set(wrap->GetFD());
}


template <class Base,
int (StreamBase::*Method)(const FunctionCallbackInfo<Value>& args)>
void StreamBase::JSMethod(const FunctionCallbackInfo<Value>& args) {
StreamBase* wrap = Unwrap<Base>(args.Holder());

if (!wrap->IsAlive())
return args.GetReturnValue().Set(UV_EINVAL);

args.GetReturnValue().Set((wrap->*Method)(args));
}

} // namespace node

#endif // SRC_STREAM_BASE_INL_H_
76 changes: 8 additions & 68 deletions src/stream_base.cc
Original file line number Diff line number Diff line change
Expand Up @@ -19,83 +19,23 @@ namespace node {
using v8::Array;
using v8::Context;
using v8::FunctionCallbackInfo;
using v8::FunctionTemplate;
using v8::Handle;
using v8::HandleScope;
using v8::Integer;
using v8::Local;
using v8::Number;
using v8::Object;
using v8::PropertyAttribute;
using v8::PropertyCallbackInfo;
using v8::String;
using v8::Value;

template void StreamBase::AddMethods<StreamWrap>(Environment* env,
Handle<FunctionTemplate> t);
template void StreamBase::AddMethods<TLSWrap>(Environment* env,
Handle<FunctionTemplate> t);
template void StreamBase::AddMethods<JSStream>(Environment* env,
Handle<FunctionTemplate> t);


template <class Base>
void StreamBase::AddMethods(Environment* env, Handle<FunctionTemplate> t) {
HandleScope scope(env->isolate());

enum PropertyAttribute attributes =
static_cast<PropertyAttribute>(v8::ReadOnly | v8::DontDelete);
t->InstanceTemplate()->SetAccessor(env->fd_string(),
GetFD<Base>,
nullptr,
Handle<Value>(),
v8::DEFAULT,
attributes);

env->SetProtoMethod(t, "readStart", JSMethod<Base, &StreamBase::ReadStart>);
env->SetProtoMethod(t, "readStop", JSMethod<Base, &StreamBase::ReadStop>);
env->SetProtoMethod(t, "shutdown", JSMethod<Base, &StreamBase::Shutdown>);
env->SetProtoMethod(t, "writev", JSMethod<Base, &StreamBase::Writev>);
env->SetProtoMethod(t,
"writeBuffer",
JSMethod<Base, &StreamBase::WriteBuffer>);
env->SetProtoMethod(t,
"writeAsciiString",
JSMethod<Base, &StreamBase::WriteString<ASCII> >);
env->SetProtoMethod(t,
"writeUtf8String",
JSMethod<Base, &StreamBase::WriteString<UTF8> >);
env->SetProtoMethod(t,
"writeUcs2String",
JSMethod<Base, &StreamBase::WriteString<UCS2> >);
env->SetProtoMethod(t,
"writeBinaryString",
JSMethod<Base, &StreamBase::WriteString<BINARY> >);
}


template <class Base>
void StreamBase::GetFD(Local<String> key,
const PropertyCallbackInfo<Value>& args) {
StreamBase* wrap = Unwrap<Base>(args.Holder());

if (!wrap->IsAlive())
return args.GetReturnValue().Set(UV_EINVAL);

args.GetReturnValue().Set(wrap->GetFD());
}


template <class Base,
int (StreamBase::*Method)(const FunctionCallbackInfo<Value>& args)>
void StreamBase::JSMethod(const FunctionCallbackInfo<Value>& args) {
StreamBase* wrap = Unwrap<Base>(args.Holder());

if (!wrap->IsAlive())
return args.GetReturnValue().Set(UV_EINVAL);

args.GetReturnValue().Set((wrap->*Method)(args));
}
template int StreamBase::WriteString<ASCII>(
const FunctionCallbackInfo<Value>& args);
template int StreamBase::WriteString<UTF8>(
const FunctionCallbackInfo<Value>& args);
template int StreamBase::WriteString<UCS2>(
const FunctionCallbackInfo<Value>& args);
template int StreamBase::WriteString<BINARY>(
const FunctionCallbackInfo<Value>& args);


int StreamBase::ReadStart(const FunctionCallbackInfo<Value>& args) {
Expand Down
4 changes: 2 additions & 2 deletions src/stream_base.h
Original file line number Diff line number Diff line change
Expand Up @@ -159,8 +159,8 @@ class StreamResource {
class StreamBase : public StreamResource {
public:
template <class Base>
static void AddMethods(Environment* env,
v8::Handle<v8::FunctionTemplate> target);
static inline void AddMethods(Environment* env,
v8::Handle<v8::FunctionTemplate> target);

virtual void* Cast() = 0;
virtual bool IsAlive() = 0;
Expand Down
3 changes: 3 additions & 0 deletions src/stream_wrap.cc
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
#include "stream_wrap.h"
#include "stream_base.h"
#include "stream_base-inl.h"

#include "env-inl.h"
#include "env.h"
#include "handle_wrap.h"
Expand Down
2 changes: 2 additions & 0 deletions src/tls_wrap.cc
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
#include "node_wrap.h" // WithGenericStream
#include "node_counters.h"
#include "node_internals.h"
#include "stream_base.h"
#include "stream_base-inl.h"
#include "util.h"
#include "util-inl.h"

Expand Down

0 comments on commit 89e133a

Please sign in to comment.