2012-07-29 15 views
14

Sto scrivendo un'estensione C++ in v8 e voglio passare un oggetto array in esso. Vedo che l'argomento in entrata può essere testato da IsArray(), ma non c'è un ToArray().Come convertire il valore v8 nell'array

Come si ottiene l'accesso alla sua lunghezza e si richiedono gli elementi in base all'indice numerico?

Handle<Value> MyExtension(const Arguments& args) 
{ 
    Handle<Value> v = args[0]; 
    if(v->IsArray()) 
    { 
     // convert to array, find its length, and access its members by index... ? 
    } 
... 
} 

Deve mancare qualcosa di ovvio qui. L'oggetto può restituire tutte le sue proprietà, ma non è proprio quello che speravo. C'è un modo per averlo come Arrray?

Grazie per la lettura.

+1

Questa è stata un po ' fa, ma non dovrebbe 'args [0] -> ToObject.As ();' fare il trucco? –

risposta

10

non ero in grado di trovare un modo per convertire o cast Array. Forse c'è un modo. Ma ho trovato facendo object->IsArray(), object->get("length")->Uint32Value() e object->get(int), ho potuto semplicemente camminare l'array.

v8::Handle<v8::Object> obj; 
// ... init obj from arguments or wherever ... 

int length = 0; 
if(obj->IsArray()) 
{ 
    length = obj->Get(v8::String::New("length"))->ToObject()->Uint32Value(); 
} 

for(int i = 0; i < length; i++) 
{ 
    v8::Local<v8::Value> element = obj->Get(i); 
    // do something with element 
} 
+0

Grazie per la modifica, @Morteza M. –

12

Si dovrebbe usare Cast metodo di una maniglia per lanciarla in un tipo diverso:

v8::Handle<v8::Array> array = v8::Handle<v8::Array>::Cast(v); 
+0

Sembra così vicino! Ma ottengo un errore di cast: errore C2440: '=': non può convertire da 'v8 :: Valore *' a 'v8 :: Oggetto * volatile' Mi chiedo ora se devo solo leggere la proprietà .length me stesso ... –

+1

questo è molto strano. So che la riga sopra * deve * compilare bene se 'v' è' Handle 'perché questo è il modo in cui' Cast' è destinato ad essere utilizzato. Dove punta l'errore di compilazione? Puoi pubblicare la tua fonte? –

4

ero in grado di far funzionare le cose in questo modo, è solo una variazione della risposta Vyacheslav Egorov ha dato

Local<Array> arr= Local<Array>::Cast(args[0]); 
printf("size %d\n",arr->Length()); 
Local<Value> item = arr->Get(0); 
3

Il sotto è il mio codice riusciti

v8::Handle<v8::Value> obj(args[0]); 

if(obj->IsArray()){ 

    v8::Local<v8::Array> arr= v8::Local<v8::Array>::Cast(args[0]); 
    v8::String::Utf8Value key(arr->Get(0)); 
    v8::String::Utf8Value value(arr->Get(1)); 

} 
Problemi correlati