Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to convert v8 Value to Array

Tags:

c++

javascript

v8

I'm writing a c++ extension to v8, and want to pass an Array object into it. I see the incoming argument can be tested by IsArray(), but there isn't a ToArray().

How do you get access to its Length, and request elements by numeric index?

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

Must be missing something obvious here. Object can return all its properties, but that's not quite what I was hoping for. Is there a way to get it as an Arrray?

Thanks for reading.

like image 916
david van brink Avatar asked Jul 29 '12 06:07

david van brink


2 Answers

You should use Cast method of a handle to cast it to a different type:

v8::Handle<v8::Array> array = v8::Handle<v8::Array>::Cast(v);
like image 69
Vyacheslav Egorov Avatar answered Sep 24 '22 07:09

Vyacheslav Egorov


I wasn't able to find a way to convert or cast to Array. Maybe there's a way. But I found by doing object->IsArray(), object->get("length")->Uint32Value(), and object->get(int), I could just walk the 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
}
like image 20
david van brink Avatar answered Sep 25 '22 07:09

david van brink