I tried every possible method but cannot intercept setting members on a Local<Function> instance. Also couldn't find any example in the https://chromium.googlesource.com/v8/v8/+/refs/heads/lkgr/test/cctest/test-api-interceptors.cc
Is this simply not possible? On Monday, March 2, 2020 at 11:32:50 AM UTC+2, Darin Dimitrov wrote: > > I managed to intercept the setting of the instance method with the > following: > > myClassTemplate->PrototypeTemplate()->SetHandler( > NamedPropertyHandlerConfiguration(nullptr, [](Local<Name> property, Local< > Value> value, const PropertyCallbackInfo<Value>& info) { > printf("This will be called when setting the instance method on the > prototype"); > })); > > > So the question remains only for the static method interception. > > > On Monday, March 2, 2020 at 11:10:26 AM UTC+2, Darin Dimitrov wrote: >> >> I am embedding V8 in my application and registered a custom class >> (MyClass). I am looking for a way to intercept the setting of methods on >> this class. >> >> Here's my code: >> >> >> auto platform = platform::NewDefaultPlatform(); >> V8::InitializePlatform(platform.get()); >> V8::Initialize(); >> std::string flags = "--expose_gc --jitless"; >> V8::SetFlagsFromString(flags.c_str(), flags.size()); >> Isolate::CreateParams create_params; >> create_params.array_buffer_allocator = ArrayBuffer::Allocator:: >> NewDefaultAllocator(); >> >> Isolate* isolate = Isolate::New(create_params); >> { >> Isolate::Scope isolate_scope(isolate); >> HandleScope handle_scope(isolate); >> >> Local<FunctionTemplate> myClassTemplate = FunctionTemplate::New( >> isolate); >> Local<FunctionTemplate> myInstanceMethodTemplate = FunctionTemplate:: >> New(isolate); >> myClassTemplate->InstanceTemplate()->Set(v8::String::NewFromUtf8( >> isolate, "myInstanceMethod", v8::NewStringType::kNormal).ToLocalChecked >> (), myInstanceMethodTemplate); >> >> Local<ObjectTemplate> globalTemplate = ObjectTemplate::New(isolate); >> globalTemplate->Set(v8::String::NewFromUtf8(isolate, "MyClass", v8:: >> NewStringType::kNormal).ToLocalChecked(), myClassTemplate); >> >> Local<v8::Context> context = v8::Context::New(isolate, nullptr, >> globalTemplate); >> Context::Scope context_scope(context); >> { >> Local<v8::Function> myClassCtor = myClassTemplate->GetFunction( >> context).ToLocalChecked(); >> Local<v8::Function> myStaticMethod = v8::Function::New(context, >> nullptr).ToLocalChecked(); >> assert(myClassCtor->Set(context, v8::String::NewFromUtf8(isolate, >> "myStaticMethod", v8::NewStringType::kNormal).ToLocalChecked(), >> myStaticMethod).FromMaybe(false)); >> >> std::string src = R"( >> // I want to intercept setting this static method and raise >> some C++ callback when this code is executed >> MyClass.myStaticMethod = () => { }; >> >> // I want to intercept setting this instance method and raise >> some C++ callback when this code is executed >> MyClass.prototype.myInstanceMethod = () => { }; >> )"; >> >> Local<v8::String> source = v8::String::NewFromUtf8(isolate, src. >> c_str(), v8::NewStringType::kNormal).ToLocalChecked(); >> Local<Script> script = Script::Compile(context, source). >> ToLocalChecked(); >> Local<Value> result = script->Run(context).ToLocalChecked(); >> assert(!result.IsEmpty()); >> } >> >> } >> >> isolate->Dispose(); >> V8::Dispose(); >> V8::ShutdownPlatform(); >> delete create_params.array_buffer_allocator; >> >> >> >> In this code I need a C++ callback to be raised when the script is trying >> to replace some existing static or instance method on my custom class. >> >> Is there some API in V8 that I can use to achieve that? >> >> I have tried registering a NamedPropertyHandlerConfiguration but my >> callback is never called: >> >> myClassTemplate->InstanceTemplate()->SetHandler( >> NamedPropertyHandlerConfiguration(nullptr, [](Local<Name> property, Local >> <Value> value, const PropertyCallbackInfo<Value>& info) { >> printf("ok"); >> })); >> >> >> Basically I need a way to detect that some script is trying to replace >> the methods which I have registered manually. >> > -- -- 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. To view this discussion on the web visit https://groups.google.com/d/msgid/v8-users/cf88bf0f-6af2-4289-9cd1-8ddac28fbbd6%40googlegroups.com.