2013-04-10 28 views
5

Znalazłem, że * v8 :: String :: Utf8Value (args [0 ] -> ToString()) zwraca właściwy ciąg w węźle 0.8.2 32-bitowym i nie zwraca poprawnego ciągu na węźle 0.8.8 64-bitowym.* v8 :: String :: Utf8Value (args [0] -> ToString()) nie zwraca łańcucha argumentu node.js addon

Czy ktoś rozumie, dlaczego?

Moja node.js dodatek wygląda następująco:

#define BUILDING_NODE_EXTENSION 
#include <node.h> 

#define MAX_OUTPUT_BUF 80 
extern "C" char *do_sqlsig(char *in); 

using namespace v8; 

Handle<Value> Sqlsig(const Arguments& args) { 
HandleScope scope; 
char *c_arg, *ret; 

if (args.Length() < 1) { 
    ThrowException(Exception::TypeError(String::New("Wrong number of arguments"))); 
    return scope.Close(Undefined()); 
} 

c_arg = *v8::String::Utf8Value(args[0]->ToString()); 

ret = c_arg; //do_sqlsig(c_arg); 

return scope.Close(String::New(ret)); 
} 

void Init(Handle<Object> exports) { 
    exports->Set(String::NewSymbol("sqlsig"), 
     FunctionTemplate::New(Sqlsig)->GetFunction()); 
} 

NODE_MODULE(sqlsig, Init) 

Jak widać Piszę otoki dla funkcji C, do_sqlsig. Znam C bardzo dobrze i wiem bardzo niewiele o C++

Odpowiedz

9

Łańcuch, który wskazywał na wskaźnik od *v8::String::Utf8Value(args[0]->ToString());, jest niszczony na końcu tej linii (gdy zniszczona jest Utf8Value). Tworzysz i niszczysz obiekt Utf8Value w jednym wierszu. Jest to niezdefiniowane zachowanie podczas deferencji zwisającego wskaźnika i dlaczego widzisz różne wyniki w różnych wersjach.

Podziel go na dwie linie, a ciąg będzie ważny, o ile znajduje się w zasięgu obiekt Utf8Value.

v8::String::Utf8Value str(args[0]->ToString()); 
c_arg = *str;