In Cloudflare Workers we just updated to v8 12.6 and spotted a new pending 
deprecation notice saying to move from using SetAccessor to 
SetNativeDataProperty. Unfortunately, there appears to possibly to be an 
issue with that when using a `v8::FunctionTemplate` and setting the 
accessor property on the `PrototypeTemplate()`

Take for example the following snippet (there are a few utility methods in 
here from the workerd codebase like check() and `js.str(...)` etc that are 
just helpers...

      auto tmpl = v8::FunctionTemplate::New(js.v8Isolate, nullptr);
      v8::Local<v8::String> foo = js.str("foo"_kj);

      tmpl->PrototypeTemplate()->SetNativeDataProperty(foo,
        [](v8::Local<v8::Name> name, const 
v8::PropertyCallbackInfo<v8::Value>& info) {
          auto& js = Lock::from(info.GetIsolate());
          info.GetReturnValue().Set(v8::Local<v8::Value>(js.str("foo"_kj)));
        },
        [](v8::Local<v8::Name> name, v8::Local<v8::Value> value,
           const v8::PropertyCallbackInfo<void>& info) {
          KJ_DBG("Setter is called!");
          info.GetReturnValue().Set(value);
        }, v8::Local<v8::Value>(), v8::PropertyAttribute::None);

      v8::Local<v8::Object> obj = 
check(tmpl->InstanceTemplate()->NewInstance(js.v8Context()));

      // The setter is not called in this case!
      check(obj->Set(js.v8Context(), foo, js.num(1)));

      // The setter IS called in this one
      check(obj->GetPrototype().As<v8::Object>()->Set(js.v8Context(), foo, 
js.num(2)));

In this case, the Setter configured on the obj prototype is not called when 
set via `obj->Set(...)`. 

The question is: with the intended move to `SetNativeDataProperty()` as 
communicated via the pending deprecation notice, is this a bug or is the 
behavior here intentional? Should setters provided 
`PrototypeInstance()->SetNativeDataProperty(...)` Just Work? Or am I just 
doing something wrong here?

-- 
-- 
v8-dev mailing list
v8-dev@googlegroups.com
http://groups.google.com/group/v8-dev
--- 
You received this message because you are subscribed to the Google Groups 
"v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to v8-dev+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/v8-dev/da4aa5ef-d4ae-4b35-ae5c-4946cf8f4d49n%40googlegroups.com.

Reply via email to