Skip to content

Commit 064c8f0

Browse files
committed
Use ObjectWrap base class for File, Socket, Server.
1 parent cf1c580 commit 064c8f0

File tree

4 files changed

+72
-101
lines changed

4 files changed

+72
-101
lines changed

src/file.cc

Lines changed: 7 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ class FileSystem {
3030
static Handle<Value> StrError (const Arguments& args);
3131
};
3232

33-
class File {
33+
class File : node::ObjectWrap {
3434
public:
3535
File (Handle<Object> handle);
3636
~File ();
@@ -50,11 +50,8 @@ class File {
5050
static int AfterRead (eio_req *req);
5151

5252
private:
53-
static File* Unwrap (Handle<Object> handle);
5453
bool HasUtf8Encoding (void);
5554
int GetFD (void);
56-
static void MakeWeak (Persistent<Value> _, void *data);
57-
Persistent<Object> handle_;
5855
};
5956

6057
static void
@@ -206,32 +203,15 @@ FileSystem::StrError (const Arguments& args)
206203
///////////////////// FILE /////////////////////
207204

208205
File::File (Handle<Object> handle)
206+
: ObjectWrap(handle)
209207
{
210208
HandleScope scope;
211-
handle_ = Persistent<Object>::New(handle);
212-
213209
InitActionQueue(handle);
214-
215-
Handle<External> external = External::New(this);
216-
handle_->SetInternalField(0, external);
217-
handle_.MakeWeak(this, File::MakeWeak);
218210
}
219211

220212
File::~File ()
221213
{
222-
// XXX call close?
223-
handle_->SetInternalField(0, Undefined());
224-
handle_.Dispose();
225-
handle_.Clear();
226-
}
227-
228-
File*
229-
File::Unwrap (Handle<Object> handle)
230-
{
231-
HandleScope scope;
232-
Handle<External> field = Handle<External>::Cast(handle->GetInternalField(0));
233-
File* file = static_cast<File*>(field->Value());
234-
return file;
214+
; // XXX call close?
235215
}
236216

237217
bool
@@ -247,20 +227,12 @@ File::GetFD (void)
247227
int fd = fd_value->IntegerValue();
248228
}
249229

250-
251-
void
252-
File::MakeWeak (Persistent<Value> _, void *data)
253-
{
254-
File *file = static_cast<File*> (data);
255-
delete file;
256-
}
257-
258230
Handle<Value>
259231
File::Close (const Arguments& args)
260232
{
261233
HandleScope scope;
262234

263-
File *file = File::Unwrap(args.Holder());
235+
File *file = NODE_UNWRAP(File, args.Holder());
264236

265237
int fd = file->GetFD();
266238

@@ -296,7 +268,7 @@ File::Open (const Arguments& args)
296268

297269
HandleScope scope;
298270

299-
File *file = File::Unwrap(args.Holder());
271+
File *file = NODE_UNWRAP(File, args.Holder());
300272

301273
// make sure that we don't already have a pending open
302274
if (file->handle_->Has(FD_SYMBOL)) {
@@ -357,7 +329,7 @@ File::Write (const Arguments& args)
357329

358330
HandleScope scope;
359331

360-
File *file = File::Unwrap(args.Holder());
332+
File *file = NODE_UNWRAP(File, args.Holder());
361333

362334
char *buf = NULL;
363335
size_t length = 0;
@@ -427,7 +399,7 @@ File::Read (const Arguments& args)
427399
if (!args[1]->IsNumber()) return Undefined();
428400

429401
HandleScope scope;
430-
File *file = File::Unwrap(args.Holder());
402+
File *file = NODE_UNWRAP(File, args.Holder());
431403
size_t length = args[0]->IntegerValue();
432404
off_t pos = args[1]->IntegerValue();
433405

src/net.cc

Lines changed: 14 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ static const struct addrinfo tcp_hints =
3232
/* ai_next */ , NULL
3333
};
3434

35-
class Server {
35+
class Server : node::ObjectWrap {
3636
public:
3737
Server (Handle<Object> handle, int backlog);
3838
~Server ();
@@ -43,13 +43,10 @@ class Server {
4343

4444
private:
4545
static oi_socket* OnConnection (oi_server *, struct sockaddr *, socklen_t);
46-
static Server* Unwrap (Handle<Object> handle);
47-
static void MakeWeak (Persistent<Value> _, void *data);
4846
oi_server server_;
49-
Persistent<Object> handle_;
5047
};
5148

52-
class Socket {
49+
class Socket : node::ObjectWrap {
5350
public:
5451
Socket (Handle<Object> handle, double timeout);
5552
~Socket ();
@@ -74,12 +71,8 @@ class Socket {
7471
static int Resolve (eio_req *req);
7572
static int AfterResolve (eio_req *req);
7673

77-
static Socket* Unwrap (Handle<Object> handle);
78-
static void MakeWeak (Persistent<Value> _, void *data);
79-
8074
enum {UTF8, RAW} encoding_;
8175
oi_socket socket_;
82-
Persistent<Object> handle_;
8376

8477
char *host_;
8578
char *port_;
@@ -88,25 +81,20 @@ class Socket {
8881
};
8982

9083
Server::Server (Handle<Object> handle, int backlog)
84+
: ObjectWrap(handle)
9185
{
86+
//HandleScope scope;
9287
oi_server_init(&server_, backlog);
9388
server_.on_connection = Server::OnConnection;
9489
// server_.on_error = Server::OnError;
9590
server_.data = this;
96-
97-
HandleScope scope;
98-
handle_ = Persistent<Object>::New(handle);
99-
handle_->SetInternalField(0, External::New(this));
100-
handle_.MakeWeak(this, Server::MakeWeak);
10191
}
10292

10393
Server::~Server ()
10494
{
105-
HandleScope scope;
95+
//HandleScope scope;
10696
oi_server_close(&server_);
10797
oi_server_detach(&server_);
108-
handle_.Dispose();
109-
handle_.Clear(); // necessary?
11098
}
11199

112100
Handle<Value>
@@ -131,7 +119,7 @@ Server::ListenTCP (const Arguments& args)
131119
if (args.Length() < 2) return Undefined();
132120
HandleScope scope;
133121

134-
Server *server = Server::Unwrap(args.Holder());
122+
Server *server = NODE_UNWRAP(Server, args.Holder());
135123

136124
String::AsciiValue port(args[0]);
137125

@@ -170,7 +158,7 @@ Handle<Value>
170158
Server::Close (const Arguments& args)
171159
{
172160
HandleScope scope;
173-
Server *server = Server::Unwrap(args.Holder());
161+
Server *server = NODE_UNWRAP(Server, args.Holder());
174162
oi_server_close(&server->server_);
175163
return Undefined();
176164
}
@@ -198,22 +186,6 @@ Server::OnConnection (oi_server *s, struct sockaddr *remote_addr, socklen_t remo
198186
return &socket->socket_;
199187
}
200188

201-
Server*
202-
Server::Unwrap (Handle<Object> handle)
203-
{
204-
HandleScope scope;
205-
Handle<External> field = Handle<External>::Cast(handle->GetInternalField(0));
206-
Server* server = static_cast<Server*>(field->Value());
207-
return server;
208-
}
209-
210-
void
211-
Server::MakeWeak (Persistent<Value> _, void *data)
212-
{
213-
Server *s = static_cast<Server*> (data);
214-
delete s;
215-
}
216-
217189
Handle<Value>
218190
Socket::New(const Arguments& args)
219191
{
@@ -270,23 +242,14 @@ Socket::SetEncoding (Handle<Value> encoding_value)
270242
}
271243
}
272244

273-
Socket*
274-
Socket::Unwrap (Handle<Object> handle)
275-
{
276-
HandleScope scope;
277-
Handle<External> field = Handle<External>::Cast(handle->GetInternalField(0));
278-
Socket* socket = static_cast<Socket*>(field->Value());
279-
return socket;
280-
}
281-
282245
Handle<Value>
283246
Socket::ConnectTCP (const Arguments& args)
284247
{
285248
if (args.Length() < 1)
286249
return Undefined();
287250

288251
HandleScope scope;
289-
Socket *socket = Socket::Unwrap(args.Holder());
252+
Socket *socket = NODE_UNWRAP(Socket, args.Holder());
290253

291254
String::AsciiValue port(args[0]);
292255
socket->port_ = strdup(*port);
@@ -374,20 +337,15 @@ Handle<Value>
374337
Socket::Close (const Arguments& args)
375338
{
376339
HandleScope scope;
377-
Socket *socket = Socket::Unwrap(args.Holder());
340+
Socket *socket = NODE_UNWRAP(Socket, args.Holder());
378341
oi_socket_close(&socket->socket_);
379342
return Undefined();
380343
}
381344

382-
void
383-
Socket::MakeWeak (Persistent<Value> _, void *data)
384-
{
385-
Socket *s = static_cast<Socket*> (data);
386-
delete s;
387-
}
388-
389345
Socket::Socket(Handle<Object> handle, double timeout)
346+
: ObjectWrap(handle)
390347
{
348+
//HandleScope scope;
391349
oi_socket_init(&socket_, timeout);
392350
socket_.on_connect = Socket::OnConnect;
393351
socket_.on_read = Socket::OnRead;
@@ -397,37 +355,28 @@ Socket::Socket(Handle<Object> handle, double timeout)
397355
socket_.on_timeout = Socket::OnTimeout;
398356
socket_.data = this;
399357

400-
HandleScope scope;
401-
handle_ = Persistent<Object>::New(handle);
402-
handle_->SetInternalField(0, External::New(this));
403-
handle_.MakeWeak(this, Socket::MakeWeak);
404-
405358
encoding_ = UTF8; // default encoding.
406359
host_ = NULL;
407360
port_ = NULL;
408361
}
409362

410363
Socket::~Socket ()
411364
{
412-
HandleScope scope;
413365
oi_socket_close(&socket_);
414366
oi_socket_detach(&socket_);
415367
free(host_);
416368
free(port_);
417369

418-
handle_->SetInternalField(0, Undefined());
370+
//HandleScope scope;
419371
handle_->Delete(String::NewSymbol("write"));
420372
handle_->Delete(String::NewSymbol("close"));
421-
422-
handle_.Dispose();
423-
handle_.Clear(); // necessary?
424373
}
425374

426375
Handle<Value>
427376
Socket::SetEncoding (const Arguments& args)
428377
{
429378
HandleScope scope;
430-
Socket *socket = Socket::Unwrap(args.Holder());
379+
Socket *socket = NODE_UNWRAP(Socket, args.Holder());
431380
socket->SetEncoding(args[0]);
432381
return Undefined();
433382
}
@@ -437,7 +386,7 @@ Socket::Write (const Arguments& args)
437386
{
438387
HandleScope scope;
439388

440-
Socket *socket = Socket::Unwrap(args.Holder());
389+
Socket *socket = NODE_UNWRAP(Socket, args.Holder());
441390

442391
// TODO support a callback using buf->on_release
443392

src/node.cc

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,43 @@ using namespace std;
2121

2222
static int exit_code = 0;
2323

24+
ObjectWrap::ObjectWrap (Handle<Object> handle)
25+
{
26+
v8::HandleScope scope;
27+
handle_ = v8::Persistent<v8::Object>::New(handle);
28+
29+
v8::Handle<v8::External> external = v8::External::New(this);
30+
handle_->SetInternalField(0, external);
31+
handle_.MakeWeak(this, ObjectWrap::MakeWeak);
32+
}
33+
34+
ObjectWrap::~ObjectWrap ( )
35+
{
36+
handle_->SetInternalField(0, Undefined());
37+
handle_.Dispose();
38+
handle_.Clear();
39+
}
40+
41+
void*
42+
ObjectWrap::Unwrap (v8::Handle<v8::Object> handle)
43+
{
44+
v8::HandleScope scope;
45+
v8::Handle<v8::External> field =
46+
v8::Handle<v8::External>::Cast(handle->GetInternalField(0));
47+
return field->Value();
48+
}
49+
50+
void
51+
ObjectWrap::MakeWeak (Persistent<Value> _, void *data)
52+
{
53+
ObjectWrap *w = static_cast<ObjectWrap*> (data);
54+
delete w;
55+
}
56+
57+
58+
59+
60+
2461
// Extracts a C string from a V8 Utf8Value.
2562
const char*
2663
ToCString(const v8::String::Utf8Value& value)

src/node.h

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,25 @@ namespace node {
1111
#define NODE_METHOD(name) v8::Handle<v8::Value> name (const v8::Arguments& args)
1212
#define NODE_SET_METHOD(obj, name, callback) \
1313
obj->Set(NODE_SYMBOL(name), v8::FunctionTemplate::New(callback)->GetFunction())
14+
#define NODE_UNWRAP(type, value) static_cast<type*>(node::ObjectWrap::Unwrap(value))
1415

1516
enum encoding {UTF8, RAW};
1617
void fatal_exception (v8::TryCatch &try_catch);
1718
void exit (int code);
1819
void eio_warmup (void); // call this before creating a new eio event.
1920

21+
class ObjectWrap {
22+
public:
23+
ObjectWrap (v8::Handle<v8::Object> handle);
24+
~ObjectWrap ( );
25+
26+
protected:
27+
static void* Unwrap (v8::Handle<v8::Object> handle);
28+
v8::Persistent<v8::Object> handle_;
29+
30+
private:
31+
static void MakeWeak (v8::Persistent<v8::Value> _, void *data);
32+
};
33+
2034
} // namespace node
2135
#endif // node_h
22-

0 commit comments

Comments
 (0)