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