2013-04-10 14 views
5

Ho trovato che * v8 :: String :: Utf8Value (args [0 ] -> ToString()) restituisce la stringa corretta sul nodo 0.8.2 a 32 bit e non restituisce la stringa corretta sul nodo 0.8.8 a 64 bit.* v8 :: String :: Utf8Value (args [0] -> ToString()) non restituisce la stringa dell'argomento addon node.js

qualcuno capisce perché?

mio addon node.js si presenta così:

#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) 

Come potete vedere sto scrivendo un wrapper per la funzione C, do_sqlsig. Conosco C molto bene e so molto poco di C++

risposta

9

La stringa con cui il puntatore restituito da *v8::String::Utf8Value(args[0]->ToString()); è point at viene distrutta alla fine di questa riga (quando Utf8Value viene distrutto). Crea e distruggi un oggetto Utf8Value in una riga. È un comportamento indefinito quando si dereferenzia un puntatore pendente e perché si visualizzano risultati diversi su versioni diverse.

Scomposizione in due righe e la stringa sarà valida finché l'oggetto Utf8Value è in ambito.

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