What you're seeing is maybe not the most meaningful behavior but it is
expected and correct.  If you try the same with a standard JS array it
will also iterate through the indexes, not the element values.

On Wed, Nov 18, 2009 at 9:36 PM, Bryan White <[email protected]> wrote:
>
> My C++ program supplies to V8 javascript code objects that represent
> some internal data structures.  Some of these data structures are in
> fact arrays of other objects.  I have implemented the 'length'
> accessor and the indexed property interceptor.  This has been working
> for a while now like this:
>
> for(var i = 0; i < list.length; ++i)
>    ... using list[i]
>
> I would like to get this working as well:
>
> for(elem in list)
>    ... do something with elem
>
> If I just do the above, elem will take on the values of the names of
> the accessors installed in the ObjectTemplate.  (length and a couple
> of other unrelated accessors).  This makes sense as it is enumerating
> it as an object, not an array.
>
> To fix this I created an call back and installed it with
> objtmpl->SetIndexedPropertyHandler(V8Get,0,0,0,V8Enum)
> (V8Enum is the new function, V8Get has been there all along.
>
> In the V8Enum function I create an array, add all the values to the
> array and return it.
>
> For reference this is the function (with app specific stuff elided to
> keep it simple):
>
> Handle<Array> V8Enum(const AccessorInfo& ai)
> {
>        int sz = ...;
>        Handle<Array> arry = Array::New(sz);
>        for(int i = 0; i < sz; ++i)
>                arry->Set( V8Int(i), ...);
>        return arry;
> }
>
>
> The V8Enum function is being called.  However the javascript
> enumeration is still seeing the names of the template accessors and
> not the array elements being returned.
>
> Am I misinterpreting how this is supposed to work?
>
> --
> Bryan White
>
> >
>

--~--~---------~--~----~------------~-------~--~----~
v8-users mailing list
[email protected]
http://groups.google.com/group/v8-users
-~----------~----~----~----~------~----~------~--~---

Reply via email to