Ok great :) On Mon, Oct 31, 2016 at 11:29 AM Zac Hansen <[email protected]> wrote:
> Never mind. You were right, I had it on my prototype template. I had > moved it at one point but at some point I must have undid the change > without realizing it, because I knew where it belonged. > > Thank you again. > > > On Monday, October 31, 2016 at 3:16:50 AM UTC-7, Zac Hansen wrote: > > Thank you for your help. I mostly understand what you're saying, but I'm > not quite clear on what I'm doing that's making holder != this. Are there > any common/semi-common things you can do while wrapping a c++ object in a > JS Object's internalfield that causes this to happen? > > When I say new MyType(), that calls into a FunctionTemplate that takes > info.This() and puts a C++ object in its internal field. The "new > MyType()" FunctionTemplate can have a bunch of stuff on it's > Instance/Prototype templates including accessors, data members, etc, though > I thought I filtered most of that out in my test cases. Is anything I > said or maybe something I'm probably doing and didn't say going to cause > the holder != this? > > Thank you so much. > > --Zac > > On Monday, October 31, 2016 at 1:39:29 AM UTC-7, Toon Verwaest wrote: > > It just follows JS property access semantics. And that's complicated. > > If you're trying to set a property, but it doesn't exist on the receiver, > we need check whether the property exists on the prototype chain. If it > does and has a setter, we need to call the setter. If it does and is > read-only, we need to throw. If it exists and isn't either of those, that > would mask a property up the prototype chain. Hence if we see an > interceptor that's not on the receiver, we need to check whether it has the > property. If it does, that would mask a non-writable/settable property > further up the prototype chain. > > So we basically get the attributes to see whether it exists and whether > it's writable. That can either be returned through the query callback, or > through the getter. > > Now for your specific problem; it seems like your simple example must > mismatch the actual code you're having. If you don't see your setter being > called at all, that just means that you put the setter on Point.prototype, > not on instances of Point. Setters for "native data properties"; which > includes interceptors; are only invoked on the receiver directly. Only real > JS accessors are called through the prototype chain. This again follows the > spec. > > On Mon, Oct 31, 2016 at 2:10 AM Zac Hansen <[email protected]> wrote: > > Stack traces for the working and non-working versions: > > https://gist.github.com/xaxxon/5eabcc079a3103abd0f7b3239b2cf3b2 > > > my v8 source is at commit: > > a05f85a3db33860f7f9651d904fd4193ee757848 > > On Saturday, October 29, 2016 at 3:33:14 AM UTC-7, Zac Hansen wrote: > > I run the following javascript: > > var p = new Point(); p.foo = 5; > > where Point creates an object from an ObjectTemplate that has > had SetHandler called on it. However, this calls my getter callback. > Everything I've tried from javascript calls my getter callback. > > object_template->SetHandler(v8::NamedPropertyHandlerConfiguration( > // Getter > [](v8::Local<v8::Name> property_name, > v8::PropertyCallbackInfo<v8::Value> const & info){ > printf("IN GETTER CALLBACK111 %s\n", > *v8::String::Utf8Value(property_name)); > }, > // setter > [](v8::Local<v8::Name> property_name, > v8::Local<v8::Value> new_property_value, > v8::PropertyCallbackInfo<v8::Value> const & info){ > printf("IN SETTER CALLBACK222 %s\n", > *v8::String::Utf8Value(property_name)); > }, > nullptr, // query > nullptr, // deleter > nullptr, // enumerator > v8::External::New(this->isolate, (void *)data), > v8::PropertyHandlerFlags::kNonMasking)); // <== Tried > with and without this > }; > > > and prints out: IN GETTER CALLBACK111 foo > > I originally tried with the older API for string-only property names and > had the same results. > > #define V8_MAJOR_VERSION 5 > #define V8_MINOR_VERSION 6 > #define V8_BUILD_NUMBER 0 > #define V8_PATCH_LEVEL 0 > > on os x 10.11 clang 3.9 > > -- > -- > v8-users mailing list > [email protected] > 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 [email protected]. > For more options, visit https://groups.google.com/d/optout. > > -- > -- > v8-users mailing list > [email protected] > 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 [email protected]. > For more options, visit https://groups.google.com/d/optout. > -- -- v8-users mailing list [email protected] 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 [email protected]. For more options, visit https://groups.google.com/d/optout.
