mirror of
https://github.com/nodejs/node.git
synced 2024-11-29 15:06:33 +01:00
Add sendUtf8 method to socket objects.
Encoding UTF-16 (the native string representation) to UTF-8 is rather expensive, however just chopping off the second bit to convert UTF-16 to ASCII is rather fast. I've noticed major performance issues with String::WriteUtf8 and thus I'm going to explicitly separate in the API. Still need interfaces to this for the web server.
This commit is contained in:
parent
2cb81113ec
commit
91bd3124ad
34
src/net.cc
34
src/net.cc
@ -56,6 +56,7 @@ Connection::Initialize (v8::Handle<v8::Object> target)
|
||||
|
||||
NODE_SET_PROTOTYPE_METHOD(constructor_template, "connect", v8Connect);
|
||||
NODE_SET_PROTOTYPE_METHOD(constructor_template, "send", v8Send);
|
||||
NODE_SET_PROTOTYPE_METHOD(constructor_template, "sendUtf8", v8SendUtf8);
|
||||
NODE_SET_PROTOTYPE_METHOD(constructor_template, "close", v8Close);
|
||||
NODE_SET_PROTOTYPE_METHOD(constructor_template, "fullClose", v8FullClose);
|
||||
NODE_SET_PROTOTYPE_METHOD(constructor_template, "forceClose", v8ForceClose);
|
||||
@ -293,6 +294,25 @@ new_buf (size_t size)
|
||||
return b;
|
||||
}
|
||||
|
||||
Handle<Value>
|
||||
Connection::v8SendUtf8 (const Arguments& args)
|
||||
{
|
||||
HandleScope scope;
|
||||
Connection *connection = NODE_UNWRAP(Connection, args.Holder());
|
||||
if (!connection) return Handle<Value>();
|
||||
|
||||
if (!args[0]->IsString())
|
||||
return ThrowException(String::New("Must have string argument"));
|
||||
|
||||
// utf8 encoding
|
||||
Local<String> s = args[0]->ToString();
|
||||
size_t length = s->Utf8Length();
|
||||
oi_buf *buf = new_buf(length);
|
||||
s->WriteUtf8(buf->base, length);
|
||||
connection->Send(buf);
|
||||
|
||||
return Undefined();
|
||||
}
|
||||
|
||||
Handle<Value>
|
||||
Connection::v8Send (const Arguments& args)
|
||||
@ -304,19 +324,17 @@ Connection::v8Send (const Arguments& args)
|
||||
// XXX
|
||||
// A lot of improvement can be made here. First of all we're allocating
|
||||
// oi_bufs for every send which is clearly inefficent - it should use a
|
||||
// memory pool or ring buffer. In either case, v8 needs to be informed
|
||||
// about our allocations deallocations via
|
||||
// V8::AdjustAmountOfExternalAllocatedMemory to give the GC hints about
|
||||
// what we're doing here. Of course, expressing binary data as an array
|
||||
// of integers is extremely inefficent. This can improved when v8 bug 270
|
||||
// (http://code.google.com/p/v8/issues/detail?id=270) has been addressed.
|
||||
// memory pool or ring buffer. Of course, expressing binary data as an
|
||||
// array of integers is extremely inefficent. This can improved when v8
|
||||
// bug 270 (http://code.google.com/p/v8/issues/detail?id=270) has been
|
||||
// addressed.
|
||||
|
||||
if (args[0]->IsString()) {
|
||||
// utf8 encoding
|
||||
// ASCII encoding
|
||||
Local<String> s = args[0]->ToString();
|
||||
size_t length = s->Utf8Length();
|
||||
oi_buf *buf = new_buf(length);
|
||||
s->WriteUtf8(buf->base, length);
|
||||
s->WriteAscii(buf->base, 0, length);
|
||||
connection->Send(buf);
|
||||
|
||||
} else if (args[0]->IsArray()) {
|
||||
|
@ -21,6 +21,7 @@ protected:
|
||||
static v8::Handle<v8::Value> v8New (const v8::Arguments& args);
|
||||
static v8::Handle<v8::Value> v8Connect (const v8::Arguments& args);
|
||||
static v8::Handle<v8::Value> v8Send (const v8::Arguments& args);
|
||||
static v8::Handle<v8::Value> v8SendUtf8 (const v8::Arguments& args);
|
||||
static v8::Handle<v8::Value> v8Close (const v8::Arguments& args);
|
||||
static v8::Handle<v8::Value> v8FullClose (const v8::Arguments& args);
|
||||
static v8::Handle<v8::Value> v8ForceClose (const v8::Arguments& args);
|
||||
|
Loading…
Reference in New Issue
Block a user