Skip to content

Commit

Permalink
Remove string converters, except NanUtf8String, which now follows nod…
Browse files Browse the repository at this point in the history
…e::Utf8Value
  • Loading branch information
kkoopa committed Jul 4, 2015
1 parent dd6e401 commit b5d00a9
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 58 deletions.
37 changes: 26 additions & 11 deletions nan.h
Original file line number Diff line number Diff line change
Expand Up @@ -737,29 +737,44 @@ class NanEscapableScope {

class NanUtf8String {
public:
NAN_INLINE explicit NanUtf8String(v8::Handle<v8::Value> from) {
v8::Local<v8::String> toStr = from->ToString();
size = toStr->Utf8Length();
buf = new char[size + 1];
toStr->WriteUtf8(buf);
NAN_INLINE explicit NanUtf8String(v8::Handle<v8::Value> from) :
length_(0), str_(str_st_) {
if (!from.IsEmpty()) {
v8::Local<v8::String> string = from->ToString();
if (!string.IsEmpty()) {
size_t len = 3 * string->Length() + 1;
assert(len <= INT_MAX);
if (len > sizeof (str_st_)) {
str_ = static_cast<char*>(malloc(len));
assert(str_ != 0);
}
const int flags = v8::String::NO_NULL_TERMINATION |
v8::String::REPLACE_INVALID_UTF8;
length_ = string->WriteUtf8(str_, static_cast<int>(len), 0, flags);
str_[length_] = '\0';
}
}
}

NAN_INLINE int length() const {
return size;
return length_;
}

NAN_INLINE char* operator*() { return buf; }
NAN_INLINE const char* operator*() const { return buf; }
NAN_INLINE char* operator*() { return str_; }
NAN_INLINE const char* operator*() const { return str_; }

NAN_INLINE ~NanUtf8String() {
delete[] buf;
if (str_ != str_st_) {
free(str_);
}
}

private:
NAN_DISALLOW_ASSIGN_COPY_MOVE(NanUtf8String)

char *buf;
int size;
int length_;
char *str_;
char str_st_[1024];
};

class NanUcs2String {
Expand Down
38 changes: 1 addition & 37 deletions test/cpp/strings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,20 +8,12 @@

#include <nan.h>

NAN_METHOD(ReturnAsciiString) {
NanReturnValue(NanNew(*NanAsciiString(args[0])));
}

NAN_METHOD(ReturnUtf8String) {
NanReturnValue(NanNew(*NanUtf8String(args[0])));
}

NAN_METHOD(ReturnUcs2String) {
NanReturnValue(NanNew(*NanUcs2String(args[0])));
}

NAN_METHOD(HeapString) {
NanUcs2String *s = new NanUcs2String(args[0]);
NanUtf8String *s = new NanUtf8String(args[0]);
v8::Local<v8::String> res = NanNew(**s);
delete s;
NanReturnValue(res);
Expand All @@ -35,27 +27,12 @@ NAN_METHOD(EncodeUCS2) {
NanReturnValue(NanEncode("h\0e\0l\0l\0o\0", 10, Nan::UCS2));
}

v8::Persistent<v8::FunctionTemplate> returnAsciiString_persistent;
v8::Persistent<v8::FunctionTemplate> returnUtf8String_persistent;
v8::Persistent<v8::FunctionTemplate> returnUcs2String_persistent;
v8::Persistent<v8::FunctionTemplate> heapString_persistent;
v8::Persistent<v8::FunctionTemplate> encodeHex_persistent;
v8::Persistent<v8::FunctionTemplate> encodeUCS2_persistent;

void Init (v8::Handle<v8::Object> target) {
v8::Local<v8::FunctionTemplate> returnAsciiString =
NanNew<v8::FunctionTemplate>(ReturnAsciiString);

NanAssignPersistent(
returnAsciiString_persistent
, returnAsciiString
);

target->Set(
NanNew("returnAsciiString")
, returnAsciiString->GetFunction()
);

v8::Local<v8::FunctionTemplate> returnUtf8String =
NanNew<v8::FunctionTemplate>(ReturnUtf8String);

Expand All @@ -69,19 +46,6 @@ void Init (v8::Handle<v8::Object> target) {
, returnUtf8String->GetFunction()
);

v8::Local<v8::FunctionTemplate> returnUcs2String =
NanNew<v8::FunctionTemplate>(ReturnUcs2String);

NanAssignPersistent(
returnUcs2String_persistent
, returnUcs2String
);

target->Set(
NanNew("returnUcs2String")
, returnUcs2String->GetFunction()
);

v8::Local<v8::FunctionTemplate> heapString =
NanNew<v8::FunctionTemplate>(HeapString);

Expand Down
14 changes: 4 additions & 10 deletions test/js/strings-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,22 +12,16 @@ const test = require('tap').test


test('FromV8String', function (t) {
t.plan(10);
t.plan(6);

var a = bindings.returnAsciiString;
var b = bindings.returnUtf8String;
var c = bindings.returnUcs2String;
var d = bindings.heapString;
var a = bindings.returnUtf8String;
var b = bindings.heapString;

t.type(a, 'function');
t.type(b, 'function');
t.type(c, 'function');
t.type(d, 'function');

t.equal(a('an ascii string'), 'an ascii string');
t.equal(a('an utf8 strïng'), 'an utf8 strïng');
t.equal(b('an utf8 strïng'), 'an utf8 strïng');
t.equal(c('an ucs2 strïng'), 'an ucs2 strïng');
t.equal(d('an utf8 strïng'), 'an utf8 strïng');

t.equal(bindings.encodeHex(), new Buffer('hello').toString('hex'));
t.equal(bindings.encodeUCS2(), 'hello');
Expand Down

0 comments on commit b5d00a9

Please sign in to comment.