thx that makes sense, just a bit unexpected. I have a pure object and enumerate keys with namedenumerator, but then if a key can be parsed into number the property gets requested has an index. It is ok since my C++ object is actually always a map, but it could become confusing if I was expecting an array backing in IndexGet.
On Apr 14, 5:40 am, Anton Muhin <[email protected]> wrote: > ajg, > > If string can be converted to an index, it's treated as index and goes > through IndexedPropertyGetter and friends. > > yours, > anton. > > On Thu, Apr 14, 2011 at 9:14 AM, ajg <[email protected]> wrote: > > thanks for suggestion. > > I did try to copy the methods manually but then some other methods > > fail, for example toString() on the object does not work since it > > checks that the object really is anarray. > > It prints out "TypeError:Array.prototype.toString is not generic" > > Copying the prototype seems to work better, both the forEach() and > > toString() seem to work, but I have to do more tests. > > > I am hitting another problem that is not related, I may post another > > question about it. > > Basically I create a JS object from an ObjectTemplate that is backed > > by a C++ object, and that object has a single key that is number-like > > (e.g. "0" or "10"). > > Then I have proper NamedPropertyGet and NamedPropertyEnumerator, but > > v8 just seems to act as if key does not exist. > > If I use the exact same object but add a letter in front of the number > > (e.g. "a0") then code works fine. > > It seems that v8 has some specific behavior if the keys are numbers, > > maybe it is confused and think it's anarray. > > I started going through v8 code but if anyone knows.. > > > On Apr 8, 3:42 am, Anton Muhin <[email protected]> wrote: > >> You were hit by some implementation details of v8. > > >> This kind of customization ideally should be performed in JS. Or you > >> can just putArray.prototype as a prototype for your objects. > > >> yours, > >> anton. > > >> On Fri, Apr 8, 2011 at 12:14 AM, ajg <[email protected]> wrote: > >> > I tried using the code below, but the "names"arrayis empty (I guess > >> > because these properties are marked as "DontEnum") > > >> > Local<v8::Object> proto = > >> > Local<v8::Object>::Cast(v8::Array::New(1)->GetPrototype()); > >> > internalFieldArrays = > >> > Persistent<ObjectTemplate>::New(ObjectTemplate::New()); > >> > Local<v8::Array> names = proto->GetPropertyNames(); > >> > for ( unsigned int i=0; i<names->Length(); i++ ) { > >> > v8::Local<v8::String> name = > >> > names->Get(i)->ToString(); > >> > internalFieldArrays->Set(name, > >> > proto->Get(name)); > >> > } > > >> > It seems that the only way to get the forEach property is: > >> > Local<v8::Value> val4 = arr->Get(v8::String::New("forEach")); > >> > Hence I would have to manually copy each property by name, there is no > >> > better way? > > >> > On Apr 7, 11:57 am, Anton Muhin <[email protected]> wrote: > >> >> Good day, ajg, > > >> >> I don't think you can (and should be able to) create v8::Arraywith > >> >> ObjectTemplate. > > >> >> However, it's easy to installArrayfunctions to any kind of > >> >> object---ECMAScriptarrayfunctions were intentionally designed to > >> >> work with generic objects---all you need is to add a length property. > >> >> Simple test would be to do something like [].forEach.call(yourobject, > >> >> args). To use convenient syntax yourobject.forEach just add > >> >>Array.prototype.forEach and other functions to prototype of your > >> >> object (see PrototypTemplate) or an object directly (1st option is > >> >> preferable). > > >> >> hth and yours, > >> >> anton. > > >> >> On Thu, Apr 7, 2011 at 9:59 PM, ajg <[email protected]> wrote: > >> >> > I already have a working ObjectTemplate that enables js code to access > >> >> > C++ objects in a lazy fashion, using the NamedPropertyHandler. > >> >> > Now I also need to create v8:Arraythat is backed by a C++ object > >> >> > using the IndexedPropertyHandler. > >> >> > But it seems that ObjectTemplate can only create a v8::Object, not a > >> >> > v8::Array. > >> >> > Doing an indexed access on v8::Object works fine but then the built-in > >> >> > functions like "forEach" are not available. > >> >> > Basically I need to either: > >> >> > - create a v8::Arraywith IndexedPropertyHandlers > >> >> > - create a v8::Object with IndexedPropertyHandlers and transfer the > >> >> > builtin methods to it, or somehow convert it to a v8::Array. > >> >> > Note that on C++ side it is not a native typearray, so I cannot use > >> >> > the v8::Object::SetIndexedPropertiesToExternalArrayData > >> >> > Any suggestion? > >> >> > thanks > > >> >> > -- > >> >> > v8-users mailing list > >> >> > [email protected] > >> >> >http://groups.google.com/group/v8-users > > >> > -- > >> > v8-users mailing list > >> > [email protected] > >> >http://groups.google.com/group/v8-users > > > -- > > v8-users mailing list > > [email protected] > >http://groups.google.com/group/v8-users > > -- v8-users mailing list [email protected] http://groups.google.com/group/v8-users
