Hi, Anton,

Thanks for your clarification!

I have to hook on the prototype, so that it is visible when other object
inherit from this object.

Is it true that the signature is a missed feature for Interceptor?


And I am confused about traversing the This of AccessorInfo.
It is easy to get __proto__ of one object, but how can we find the object
itself through its prototype?



Thanks~

Cheers~
Xiang








On Tue, Dec 1, 2009 at 8:49 PM, Anton Muhin <ant...@chromium.org> wrote:

> Good day, Xiang.
>
> First of all, I think you'd better off keeping an interceptor on the
> objects.  If you're still determined to keep it on the prototype, you
> should be able to find an object, but you will have to traversal from
> the This of AccessorInfo.  Please note that is somewhat fragile as one
> can change prototype chain.
>
> yours,
> anton.
>
> On Tue, Dec 1, 2009 at 3:11 PM, Xiang Zhong <clock...@gmail.com> wrote:
> > Hi, All,
> > There are two object involved:
> > Prototype
> >    ^
> >    |
> >    |
> > Object
> >
> > I set interceptor on prototype template, and have set internal field on
> > Object.
> > Is there a way to access these internal field of Object in intercrptor of
> > Prototype?
> >
> >
> > For Accessor, there is a way to define signature, then the VM will pass
> the
> > right object to accessor, how about inteceptors?
> >
> > Please check the following sample, it will crash if I try a access the
> > internal filed.
> >
> > #include <v8.h>
> > #include <iostream>
> > #include <fstream>
> > #include <sstream>
> > #include <cmath>
> > using namespace v8;
> > v8::Handle<v8::Value> Getter(v8::Local<v8::String> propertyName,const
> > v8::AccessorInfo &info) {
> >    v8::HandleScope handleScope;
> >     v8::Handle<v8::External> external =
> > v8::Handle<v8::External>::Cast(info.Holder()->GetInternalField(0));
> >     void * message = external->Value();
> >     const char * str =  (const char *)message;
> >     printf(str);
> >     //return something that is not NULL back
> >     return v8::True();
> > }
> > Handle<Value> CreateObjectWithInteceptor(const Arguments& args)
> > {
> >     HandleScope handleScope;
> >     const char * test = "With Inteceptor";
> >     v8::Handle<v8::External> external = v8::External::New((void *)test);
> >     args.Holder()->SetInternalField(0, external);
> >     return args.Holder();
> > }
> > int main()
> > {
> > HandleScope handleScope;
> >
> >   Handle<FunctionTemplate> functionTemplate =
> > FunctionTemplate::New(CreateObjectWithInteceptor);
> >
> functionTemplate->SetClassName(String::New("CreateObjectWithInteceptor"));
> > v8::Local<v8::Signature> default_signature =
> > v8::Signature::New(functionTemplate);
> > Handle<ObjectTemplate> instanceTemplate =
> > functionTemplate->InstanceTemplate();
> > instanceTemplate->SetInternalFieldCount(1); // create an internal field
> for
> > the C++ object
> > Handle<ObjectTemplate> prot = functionTemplate->PrototypeTemplate();
> > prot->SetNamedPropertyHandler(Getter);
> >
> > Handle<ObjectTemplate> globals = ObjectTemplate::New();
> >   globals->Set(String::New("object"), instanceTemplate); // add our print
> > function
> > Persistent<Context> context = Context::New(0, globals);
> > Context::Scope contextScope(context);
> > Handle<Script> script =
> Script::Compile(v8::String::New("object.getValue"));
> > Handle<Value> result = script->Run();
> > context.Dispose();
> > return 0;
> > }
> >
> > Cheers~
> > Xiang
> >
> > --
> > v8-dev mailing list
> > v8-dev@googlegroups.com
> > http://groups.google.com/group/v8-dev
>
> --
> v8-dev mailing list
> v8-dev@googlegroups.com
> http://groups.google.com/group/v8-dev

-- 
v8-dev mailing list
v8-dev@googlegroups.com
http://groups.google.com/group/v8-dev

Reply via email to