diff --git a/Lib/javascript/v8/javascriptstrings.swg b/Lib/javascript/v8/javascriptstrings.swg index 6bba0436e..14a96c63e 100644 --- a/Lib/javascript/v8/javascriptstrings.swg +++ b/Lib/javascript/v8/javascriptstrings.swg @@ -7,13 +7,12 @@ SWIGINTERN int SWIG_AsCharPtrAndSize(v8::Handle valRef, char** cptr, size_t* psize, int *alloc) { if(valRef->IsString()) { - v8::Handle js_str = valRef->toString(); + v8::Handle js_str = valRef->ToString(); size_t len = js_str->Utf8Length(); size_t abs_len = js_str->Length(); char* cstr = new char[len]; js_str->WriteUtf8(cstr, len); - JSStringGetUTF8CString(js_str, cstr, len); if(alloc) *alloc = SWIG_NEWOBJ; if(psize) *psize = abs_len + 1; diff --git a/Lib/javascript/v8/std_string.i b/Lib/javascript/v8/std_string.i new file mode 100755 index 000000000..0d6143319 --- /dev/null +++ b/Lib/javascript/v8/std_string.i @@ -0,0 +1,68 @@ +/* ----------------------------------------------------------------------------- + * std_string.i + * + * Typemaps for std::string and const std::string& + * These are mapped to a JSCore String and are passed around by value. + * + * To use non-const std::string references use the following %apply. Note + * that they are passed by value. + * %apply const std::string & {std::string &}; + * ----------------------------------------------------------------------------- */ + +%{ +#include +%} + +namespace std { + +%naturalvar string; + +class string; + +// string + +%typemap(in) string +%{ + if(!$input->IsString()) { + // TODO: Throw exception? + return NULL; + } + + size_t $1_strsize = js_str->Utf8Length(); + char* 1_cstr = new char[1_strsize]; + js_str->WriteUtf8(1_cstr, 1_strsize); + $1 = std::string($1_cstr); +%} + +%typemap(out) string %{ + $result = v8::String::New($1.c_str(), $1.size()); +%} + +%typemap(freearg) string +%{%} + +// const string & +%typemap(in) const string & +%{ + + if(!$input->IsString()) { + // TODO: Throw exception? + return NULL; + } + + size_t $1_strsize = js_str->Utf8Length(); + char* 1_cstr = new char[1_strsize]; + js_str->WriteUtf8(1_cstr, 1_strsize); + $1 = newstd::string($1_cstr); +%} + +%typemap(out) const string & %{ + $result = v8::String::New($1.c_str(), $1.size()); +%} + +%typemap(freearg) const string & //TODO: Not working: A memory leak +%{ free($1_cstr); %} + +//%typemap(typecheck) const string & = char *; + +}