On Aug 17, 7:35 am, Anton Muhin <[email protected]> wrote: > I see. Sorry, I hoped it might work. > > I am afraid v8 currently doesn't support the thing you need just immediately. > > Possible ways out: > > 1) implement it :)
I'm happy to give it a go if you think it is doable and you can provide some pointers on where to start. > 2) chances are you could do that in one tricky way: you can access > PrototypeTemplate of FunctionTemplate and probably you can set > interceptor on this prototype template object; caveat: it might be > somewhat slower---interceptors inhibit some v8 optimizations, but if > it works at all, check if speed is acceptable for you > 3) [variation of the previous idea]: create another object with > interceptor reflecting Ruby class and put is somewhere in prototype > chain of the function (e.g. below prototype). I actually tried this set up and it does work quite well for intercepting property reads, but sadly does not work for setter, query, etc... That said, for my current usage, the getter should handle 95% most of the cases, so I'll probably implement it that way in the interim. cheers, Charles > > However, I am not sure you'll be able to enumerate those properties > with getOwnProperties. > > And there is another workaround: if you have hooks on property > assignment to Ruby classes, you could propagate those changes to JS > counterparts. > > hth and yours, > anton. > > On Tue, Aug 17, 2010 at 1:26 AM, Charles Lowell<[email protected]> > wrote: > > Anton, > > > I have run a few experiments using an ObjectTemplate in place of a > > FunctionTemplate, and it looks like it falls short of a number of > > ways: > > I have an Object with a CallAsFunctionHandler named 'Foo' in this > > scope that just returns a plain object. > > > Foo.prototype = {bar: 'baz'} > > var f = new Foo() > > print("foo: ", Foo) //=> [object Object], should be function Foo() {}. > > print("typeof Foo: ", typeof Foo) //=> 'object', should be 'function' > > print("f.constructor == Foo: ", f.constructor == Foo) //=> false, > > should be true > > print("f.bar: ", f.bar) //=> undefined, should be 'baz' > > print("f instanceof Foo", f instanceof Foo) //=> TypeError: Expecting > > a function in instanceof check, but got #<an Object> > > > you can see the full program here: > > >http://gist.github.com/527745 > > > As you can see SetCallAsFunctionHandler() doesn't really do all that > > well as a constructor. > > > cheers, > > Charles > > > On Aug 10, 3:05 pm, Charles Lowell <[email protected]> wrote: > >> It might, provided typeof is 'function' and the constructor property > >> is setup correctly. The other problem is that I currently invoke these > >> constructor functions from C++ via NewInstance() and I can't find the > >> equivalent of CallAsFunction() or NewInstanceAsFunction() on Object. > > >> I may be able to find a way around this by wiring up the ruby and js > >> peers without calling constructors from C++, but IIRC that was a very > >> clean solution to make sure all the peered objects, whether > >> constructed from javascript or injected directly into the context went > >> through the same coupling code. I'll give it a try and let you know > >> what I find. > > >> cheers, > >> Charles > > >> On Aug 10, 2:31 pm, Anton Muhin <[email protected]> wrote: > > >> > I don't know for sure, but won't SetCallAsFunctionHandler help you? > > >> > yours, > >> > anton. > > >> > On Tue, Aug 10, 2010 at 11:11 PM, Charles Lowell > > >> > <[email protected]> wrote: > > >> > > On Aug 10, 8:09 am, Anton Muhin <[email protected]> wrote: > >> > >> Sorry, wrong address again. > > >> > >> On Tue, Aug 10, 2010 at 5:06 PM, Anton Muhin <[email protected]> > >> > >> wrote: > >> > >> > Charles, > > >> > >> > I probably miss something here, but why you need FunctionTemplates > >> > >> > at > >> > >> > all, could not you use only ObjectTemplates? > > >> > > How do I implement constructor functions with ObjectTemplate ? > > >> > >> > yours, > >> > >> > anton. > > >> > >> > On Mon, Aug 9, 2010 at 10:58 PM, Charles Lowell > >> > >> > <[email protected]> wrote: > >> > >> >> Anton, > > >> > >> >> Thanks for the reply. Perhaps it will make it clearer if I provide > >> > >> >> some context. I'm asking in the context of The Ruby Racer, which > >> > >> >> allows for embedding V8 into Ruby, and in particular what ruby > >> > >> >> classes > >> > >> >> look like from javascript. > > >> > >> >> Currently, we model ruby instances reflected into javascript as > >> > >> >> instances created off of a FunctionTemplate which corresponds to > >> > >> >> that > >> > >> >> instance's class. The FunctionTemplate corresponding to the ruby > >> > >> >> class > >> > >> >> has property interceptors which it sets via > >> > >> >> FunctionTemplate::InstanceTemplate()->Set{Named/Indexed} > >> > >> >> PropertyHandler. > > >> > >> >> The problem comes when we actually embed the ruby classes > >> > >> >> themselves > >> > >> >> into javascript. This is done by having the class's > >> > >> >> FunctionTemplate's > >> > >> >> CallHandler invoke the ruby constructor of the class, and then > >> > >> >> associat it with a javascript instance created by calling > >> > >> >> GetFunction().NewInstance(). That way, the constructor can be > >> > >> >> (optionally) called directly from javascript, and the object's > >> > >> >> 'constructor' will point to the right place. > > >> > >> >> However, ruby classes (like javascript constructors) are objects > >> > >> >> too > >> > >> >> with their own properties and methods and so I would like to be > >> > >> >> able > >> > >> >> to intercept access to properties against the constructor function > >> > >> >> itself in the same way that I intercept property access on > >> > >> >> objects. In > >> > >> >> one sentence: I want to delegate Function object properties to a > >> > >> >> ruby > >> > >> >> object in the same way that I delegate regular object properties > >> > >> >> to a > >> > >> >> ruby object. > > >> > >> >> Perhaps a little code would shed some light. > > >> > >> >> class SomeClass > >> > >> >> #instance method > >> > >> >> def one > >> > >> >> 1 > >> > >> >> end > >> > >> >> end > > >> > >> >> #a class method > >> > >> >> def SomeClass.two > >> > >> >> 2 > >> > >> >> end > > >> > >> >> cxt = V8::Context.new > >> > >> >> cxt['SomeClass'] = SomeClass > >> > >> >> cxt.eval(<<--JS) > >> > >> >> var s = new SomeClass() > >> > >> >> s.one //=> 1 > >> > >> >> s.constructor == SomeClass //=> true > >> > >> >> SomeClass.two //=> currently undefined, I would like this to invoke > >> > >> >> SomeClass.two() > >> > >> >> JS > > >> > >> >> It could be that there is an obvious solution which I've missed, > >> > >> >> but > >> > >> >> does that help frame the question? > > >> > >> >> cheers, > >> > >> >> Charles > > >> > >> >> On Aug 9, 11:18 am, Anton Muhin <[email protected]> wrote: > >> > >> >>> Sorry, from the right address. > > >> > >> >>> On Mon, Aug 9, 2010 at 8:16 PM, Anton Muhin <[email protected]> > >> > >> >>> wrote: > >> > >> >>> > Charles, good day, > > >> > >> >>> > On Mon, Aug 9, 2010 at 7:56 PM, Charles Lowell > >> > >> >>> > <[email protected]> wrote: > >> > >> >>> >> While we're on the subject of property interceptors and API > >> > >> >>> >> asymmetries, I can't figure out to add named and indexed > >> > >> >>> >> getter/ > >> > >> >>> >> setter, etc.. to Function objects inside the javascript > >> > >> >>> >> runtime. I've > >> > >> >>> >> searched extensively for a way to do this, but nothing as > >> > >> >>> >> reliable as > >> > >> >>> >> ObjectTemplate::SetNamedPropertyHandler() > > >> > >> >>> > I don't quite understand what do you mean by 'inside the > >> > >> >>> > javascript > >> > >> >>> > runtime'? Do you want to invoke JS function? Or add native > >> > >> >>> > interceptor to JS function (to be invoked as a constructor)? > > >> > >> >>> > AFAIK currently one can only add interceptors (both named and > >> > >> >>> > indexed) > >> > >> >>> > to FunctionTemplates. > > >> > >> >>> > BTW, what are you trying to achieve? If you could tell us, > >> > >> >>> > maybe > >> > >> >>> > there could be found some way out. > > >> > >> >>> > yours, > >> > >> >>> > anton. > > >> > >> >>> >> On Aug 6, 12:49 pm, Anton Muhin <[email protected]> wrote: > >> > >> >>> >>> From the right address. > > >> > >> >>> >>> On Fri, Aug 6, 2010 at 9:39 PM, Anton Muhin > >> > >> >>> >>> <[email protected]> wrote: > >> > >> >>> >>> > Charles, > > >> > >> >>> >>> > I just didn't have to time to implement the same > >> > >> >>> >>> > functionality for > >> > >> >>> >>> > indexed interceptor. Filing a bug and cc'ing you. > > >> > >> >>> >>> > I'll try to implement it, but it might require some time to > >> > >> >>> >>> > roll in to > >> > >> >>> >>> > make transition to new api smooth. > > >> > >> >>> >>> > yours, > >> > >> >>> >>> > anton. > > >> > >> >>> >>> > On Fri, Aug 6, 2010 at 9:31 PM, Charles Lowell > >> > >> >>> >>> > <[email protected]> wrote: > >> > >> >>> >>> >> Hi, > > >> > >> >>> >>> >> I've noticed a small asymmetry in the interfaces for > >> > >> >>> >>> >> IndexedPropertyQuery and NamedPropertyQuery. Specifically > >> > >> >>> >>> >> that the > >> > >> >>> >>> >> indexed version returns just a Boolean instead of and > >> > >> >>> >>> >> Integer encoding > >> > >> >>> >>> >> property attributes. Is this intentional? Rhino, for > >> > >> >>> >>> >> example allows > >> > >> >>> >>> >> for specifying attributes for indexed values as well. > > >> > >> >>> >>> >> cheers, > >> > >> >>> >>> >> Charles > > >> > >> >>> >>> >> -- > >> > >> >>> >>> >> 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 > > > -- > > 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
