Okay, I finally found a solution. I can return function from NamedHandler like this:
Local<Value> ft = FunctionTemplate::New(info.GetIsolate(), FunctionAHandler)->GetFunction(); info.GetReturnValue().Set(ft); After that it will call function FunctionAHandler from NamedGetter and pass all arguments to it. I've been looking for solution for three days and found in one hour after posting a question here. ) вторник, 11 сентября 2018 г., 16:24:27 UTC+3 пользователь Andrei Vinogradov написал: > > Hello. > I'm trying to create new template that should match required behaviour but > now i'm stuck with NamedPropertyHandler. > What I need to achieve: > 1. All property access calls should be processed by unified handlers > (getter/setter for indexed access and getter/setter for named access). > (This part is working). > 2. Template also should have a set of predefined functions with different > handlers for each. (This part is not working). > > What I am doing. Assume that we have code like following: > > void NamedGetter(Local<Name> name, const PropertyCallbackInfo<Value> &info > ) { ... } > void NamedSetter(Local<Name> name, Local<Value> value, const > PropertyCallbackInfo<Value> &info) { ... } > void IndexedGetter(uint32_t index, const PropertyCallbackInfo<Value> &info > ) { ... } > void IndexedSetter(uint32_t index, Local<Value> value, const > PropertyCallbackInfo<Value> &info) { ... } > void FunctionAHandler(const FunctionCallbackInfo<Value> &info) { ... } > > //Lets skip initialization code... > > Local<String> funcName = String::NewFromUtf8(isolate, "FunctionA", v8:: > NewStringType::kNormal).ToLocalChecked(); > > Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); > templ->Set(funcName, FunctionTemplate::New(isolate, FunctionAHandler, > funcName)); > templ->SetHandler(NamedPropertyHandlerConfiguration(NamedGetter, > NamedSetter)); > templ->SetHandler(IndexedPropertyHandlerConfiguration(IndexedGetter, > IndexedSetter)); > > //Creating instance of template in current context with name my_instance... > > Then, when i'm executing JS like "my_instance.FunctionA();" this is > proccessed by V8 like i'm accessing property with name "FunctionA". I mean > it's starting to execute NamedGetter function. > And after that it fails with error: > > <unknown>:10: Uncaught TypeError: my_instance.FunctionA is not a function > > If I'm not adding NamedPropertyHandler to template - FunctionAHandler is > invoked like expected. > So my question is - how to avoid executing NamedGetter when function with > such name is defined on template? Or maybe i't possible to proccess > function calls inside NamedGetter and avoid creating handlers for each > function I need in template? > I would appreciate any help with this. > -- -- v8-users mailing list v8-users@googlegroups.com http://groups.google.com/group/v8-users --- You received this message because you are subscribed to the Google Groups "v8-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to v8-users+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.