2012-07-29 19 views
14

Estoy escribiendo una extensión C++ a v8, y quiero pasar un objeto Array en ella. Veo que el argumento entrante puede ser probado por IsArray(), pero no hay un ToArray().Cómo convertir valor v8 a matriz

¿Cómo se accede a su longitud y se solicitan los elementos por índice numérico?

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... ? 
    } 
... 
} 

Algo falta obvio aquí. Object puede devolver todas sus propiedades, pero eso no es exactamente lo que esperaba. ¿Hay alguna manera de obtenerlo como Arrray?

Gracias por leer.

+1

Este fue un tiempo Hace, pero no debería 'args [0] -> ToObject.As ();' ¿hacer el truco? –

Respuesta

10

yo no era capaz de encontrar una manera de convertir o fundido a la matriz. Tal vez hay una manera. Pero descubrí que al hacer object->IsArray(), object->get("length")->Uint32Value() y object->get(int), podía caminar por la matriz.

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

Gracias por la edición, @Morteza M. –

12

Debe utilizar Cast método de un asa para su emisión a un tipo diferente:

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

¡Parece tan cerca! Pero obtengo un error de conversión: error C2440: '=': no ​​se puede convertir de 'v8 :: Value *' a 'v8 :: Object * volátil' Me pregunto ahora si solo tengo que leer la propiedad .length yo mismo ... –

+1

esto es muy extraño. Sé que la línea de arriba * debe * compilarse muy bien si 'v' es' Handle 'porque así es como 'Cast' está destinado a ser utilizado. ¿A dónde apunta el error de compilación? ¿Puedes publicar tu fuente? –

4

yo era capaz de hacer las cosas de trabajo como éste, es sólo una variación de la respuesta Vyacheslav Egorov dio

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

La continuación es mi código logrado

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

}