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 <xax...@gmail.com <javascript:>> 
> 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
>> v8-u...@googlegroups.com <javascript:>
>> 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+u...@googlegroups.com <javascript:>.
>> For more options, visit https://groups.google.com/d/optout.
>>
>

-- 
-- 
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.

Reply via email to