On Wed, Mar 7, 2012 at 3:39 PM, cruisercoder <[email protected]> wrote: > That seems to work better (no SetInternalField error): > > Handle<Object> proto = Handle<Object>::Cast(fn- >>Get(String::New("prototype"))); > proto->SetInternalField(0, External::New(data)); > > I'm still not sure about how to access the function and it's prototype > through the args object in the callback.
Is that not args.Callee()? > > The problem with the Set callback data is that it requires the data to > be available a little earlier than I wanted. Every problem in CS can be solved by adding one layer of indirection: you can set an object/array that gets later updated points to the right value. > It seems like I should > be able to use internal data fields for functions in the same way that > I do for objects. > > erik > > > On Mar 6, 10:29 pm, Matthias Ernst <[email protected]> wrote: >> On Wed, Mar 7, 2012 at 3:16 AM, cruisercoder <[email protected]> wrote: >> > How do I get internal data for function callbacks? The approach I'm >> > currently taking is to use the function's prototype object where I can >> > declare an internal field and then set it at context time. However, >> > I get an error about the internal field count when I retrieve the >> > prototype and try to set data (code and error shown below). >> >> > I'm also not sure about how to unpack the data in the handler. >> >> > erik >> >> > v8::Handle<v8::Value> myHandler(const v8::Arguments& args) { >> > nd::unused(args); >> > using namespace v8; >> > return Undefined(); >> > } >> >> > using namespace v8; >> > HandleScope handle_scope; >> >> > v8::Persistent<v8::ObjectTemplate> global_template = >> > Persistent<ObjectTemplate>::New(ObjectTemplate::New()); >> >> > Handle<FunctionTemplate> tmpl = FunctionTemplate::New(myHandler); >> >> > Handle<ObjectTemplate> proto_t = tmpl->PrototypeTemplate(); >> > proto_t->SetInternalFieldCount(1); >> >> > global_template->Set(String::New("myFunction"),tmpl); >> >> > Persistent<Context> context = Context::New(0, global_template); >> >> > Context::Scope context_scope(context); >> >> > Handle<Function> fn = tmpl->GetFunction(); >> > Handle<Object> proto = Handle<Object>::Cast(fn->GetPrototype()); >> >> GetPrototype() is a method of Object and returns object's __proto__ >> (which I guess is "Function.prototype" in this case). You want >> fn.Get(String::New("prototype")). >> >> Not quite sure what you're trying to achieve, but you can also >> register callback data in FunctionTemplate::New (the "data" parameter) >> which will be passed into your callback as Arguments::Data(). >> >> Matthias >> >> >> >> >> >> >> >> >> >> > void *data(0); >> > proto->SetInternalField(0, External::New(data)); >> >> > # >> > # Fatal error in v8::Object::SetInternalField() >> > # Writing internal field out of bounds >> > # >> >> > -- >> > 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
